我有两个用制表符分隔的文件。按第一个字段比较文件,我需要打印字段不匹配的行。但是要打印的行来自文件 (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
也就是说,隐含连接线并打印第一个文件中的不成对线。默认情况下,联接是按第一个字段进行的。