仅当 第二个字段 不在 file2 中时,才会从 file1.txt 打印行:
$ awk -F, 'FNR==NR{a[$1]=1; next;} !a[$2]' file2 file1.txt
aaa,,,,,
aaa,10001782,,,,
bbb,10001783,,,,
工作原理
这通过读取 file2 并跟踪在关联数组 a 中看到的所有行来工作。然后,仅当 file1.txt 的第 2 列不在 a 中时,才会打印 file1.txt 中的行。更详细:
-
FNR==NR{a[$1]=1; next;}
在读取file2 时,将a[$1] 设置为1 以表明我们已经看到了这一行的值。然后我们指示 awk 跳过其余命令并从 next 行重新开始。
此部分仅针对 file2 运行,因为 file2 在命令行中首先列出,FNR==NR 仅在我们读取命令行中列出的第一个文件时。这是因为FNR 是从当前文件读取的行数,NR 是目前读取的总行数。这两个仅对第一个文件相等。
-
!a[$2]
读取 file1.txt 时,如果在 file2 中看到第 2 列,a[$2] 的计算结果为 true。因为! 是否定的,所以!a[$2] 在没有看到第2 列时评估为真。当计算结果为 true 时,将打印该行。
另类
这是相同的逻辑,表达方式略有不同,正如 Tom Fenech 在 cmets 中所建议的那样:
$ awk -F, 'FNR==NR{a[$1]; next;} !($2 in a)' file2 file1.txt
aaa,,,,,
aaa,10001782,,,,
bbb,10001783,,,,