AWK - 如果不在数组中



我有两个用制表符分隔的文件。按第一个字段比较文件,我需要打印字段不匹配的行。但是要打印的行来自文件 (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[$1]=$0;next} !($1 in a)' file1 file2
但是我需要打印,来自文件(文件1)的

行而不是来自文件(文件2)的行。而且我无法更改处理文件的顺序

我不

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

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

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

为什么不交换你传递给awk的参数中的文件,

awk 'FNR==NR{a[$1]=$0;next} !($1 in a)' file2 file1
                                          |     |
                                         arg1  arg2

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

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

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

晚了,但这里有一个更简单的方法

$ join -v1 file1 file2
adum adu noun singular 1s n/a nominative

也就是说,隐含连接线并打印第一个文件中的不成对线。默认情况下,联接是按第一个字段进行的。

相关内容

  • 没有找到相关文章

最新更新