#マッチング
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] # キーが存在している連想配列を出力
}'