AWK - 如果不在数组中

AWK - if not in array

我有两个用制表符分隔的文件。通过第一个字段比较文件,我需要打印字段不匹配的行。但是要打印的行来自文件 (file1)

文件 1:

adu adu noun    singular    n/a n/a nominative
aduink  adu noun    plural  1pl n/a nominative
adum    adu noun    singular    1s  n/a nominative

文件 2:

adu adu noun    singular    n/a n/a nominative
aduink  adu noun    plural  1pl n/a nominative
xxadum  adu noun    singular    1s  n/a nominative

期望的输出:

adum    adu noun    singular    1s  n/a nominative

我在想什么:

awk 'FNR==NR{a[]=[=13=];next} !( in a)' file1 file2

但我需要打印文件 (file1) 中的行,而不是文件 (file2) 中的行。而且我无法更改处理文件的顺序

为什么不交换传递给 awk

的参数中的文件
awk 'FNR==NR{a[]=[=10=];next} !( in a)' file2 file1
                                          |     |
                                         arg1  arg2

我不明白为什么你不能改变文件顺序(那更简单),但你有相同的顺序,你可以这样做:

awk 'NR==FNR{ a[]=[=10=]; next }
     { delete a[] }
     END{ for (x in a) print a[x] }' file1 file2

想法是在处理第二个文件时删除索引 处的所有项目。然后最后,你只需要打印剩余的项目。

如果在调用 awk 时无法更改文件顺序,只需在 awk 中更改即可:

awk 'BEGIN{t=ARGV[1]; ARGV[1]=ARGV[2]; ARGV[2]=t} FNR==NR{a[];next} !( in a)' file1 file2

这样您就不必将任何一个文件存储在内存中。

聚会迟到了,但这里有一个更简单的方法

$ join -v1 file1 file2

adum adu noun singular 1s n/a nominative

也就是说,抑制连接的行并打印第一个文件中未成对的行。默认情况下,按第一个字段加入。