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