即使没有打印,这在 awk 中如何工作?

即使没有打印,这在 awk 中如何工作?
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 则打印”。

相关内容