LoginSignup
2
0

More than 5 years have passed since last update.

awkによるマッチング(ワンライナー)

Last updated at Posted at 2018-03-03

マッチング

ExcelのVlookup関数のようにawkでも簡単にマッチングができます。しかもワンライナーでできます。

データサンプル

[root@akirakikaku tmp]# cat a
a  232
b  999
c  655
d  888
f  755
[root@akirakikaku tmp]# cat b
544 a hjhgjgh
110 c fdgdfg
997 d jhgjhg
554 e jhgjhgjghdd
[root@akirakikaku tmp]#

awkマッチング…同一レコード表示

  • aファイルの1列目とbファイルの2列目をマッチング
  • 同一レコードのみ表示
[root@akirakikaku tmp]# cat a | awk 'BEGIN{ while((getline < "b") > 0){key[$2]=$0}} key[$1]{print $0,key[$1]}'
a  232 544 a hjhgjgh
c  655 110 c fdgdfg
d  888 997 d jhgjhg
[root@akirakikaku tmp]#

awkマッチング…aファイルと同一key

  • aファイルの1列目とbファイルの2列目をマッチング
  • aファイルはすべて。bファイルは同一レコード。

[root@akirakikaku tmp]# cat a | awk 'BEGIN{ while((getline < "b") > 0){key[$2]=$0}} {print $0,key[$1]}'
a  232 544 a hjhgjgh
b  999
c  655 110 c fdgdfg
d  888 997 d jhgjhg
f  755
[root@akirakikaku tmp]#

awkマッチング…bファイルと同一key

  • aファイルの1列目とbファイルの2列目をマッチング
  • bファイルはすべて。aファイルは同一レコード。
[root@akirakikaku tmp]# cat b | awk 'BEGIN{ while((getline < "a") > 0){key[$1]=$0}} {print $0,key[$2]}'
544 a hjhgjgh a  232
110 c fdgdfg c  655
997 d jhgjhg d  888
554 e jhgjhgjghdd
[root@akirakikaku tmp]#

awk解説

cat a | \
  awk '
    BEGIN{ 
      while((getline < "b") > 0){   # bファイルを全部読み込み
        key[$2]=$0                  # 連想配列
      }                             # 2列をキーにしてレコード全体を格納
    } 
    {                             # aファイルのレコード全体と
      print $0,key[$1]            # キーが存在している連想配列を出力
    }'
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0