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 为“假”,任何其他数字为“真”。感叹号 ( !
) 反转测试。
所以!a[$1]
本质上相当于说“如果a[$1]
等于 0 则打印”。