bash-3.00# cat > b1.txt
AAA,Apples,123
BBB,Bananas,124
CCC,Carrot,125
bash-3.00# cat > b2.txt
Store1|AAA|123|11
Store2|BBB|124|23
Store3|CCC|125|57
Store4|DDD|126|38
bash-3.00# awk -F"[,|]" 'NR==FNR{a[$1]++;next} !a[$2]' b1.txt b2.txt
Store4|DDD|126|38
NR==FNR
最初のファイルがtrueを返すとa[$1]
増加します。next
スクリプトの先頭に戻ります。ところで!a[$2]
ここで何が起こっているのでしょうか?コマンドなしでprint
どのように印刷されますか?
答え1
~からPOSIXawk
仕様:
awk プログラムは、次の形式のペアで構成されます。
pattern { action }
パターンまたは操作(括弧文字を含む)のいずれかを省略できます。 ...[A] 欠落している操作は次のとおりです。
{ print }
!a[$2]
あなたの場合模様、そして行動力の欠如。
答え2
前の回答を拡張すると、次のようになります。
awk
真/偽のテストを数値として扱います。 0 は「FALSE」、その他の数字は「TRUE」です。感嘆符(!
)はテストを反転します。
したがって、!a[$1]
本質的に「0と同じなら印刷します」と言うのと同じですa[$1]
。