我需要从data.txt中找到与filter.txt中的数据不匹配的记录。早些时候,我使用grep -vf filter.txt data.txt
,它工作正常,但速度很慢。
根据grep -vf too slow with large files中的讨论,我切换到了
awk 'FNR==NR {hash[$0]; next} !($0 in hash)' filter.txt data.txt > op.txt
如果filter.txt不为空,则有效。
data.txt中
data1
data2
data3
filter.txt
data1
op.txt
data2
data3
但如果filter.txt为空则失败。如果filter.txt为空,则输出op.txt也为空。理想情况下,它应该等于data.txt。
尝试使用ARGIND == 1。似乎适用于空filter.txt,但对非空filter.txt产生错误的结果。预期的产出在上面。
$ cat filter.txt
abc2
$ awk 'ARGIND==1{hash[$0]; next} !($0 in hash)' filter.txt data.txt > op.txt
$ cat op.txt
abc2
abc1
abc2
abc3
$ vi filter.txt
$ cat filter.txt
$ awk 'ARGIND==1{hash[$0]; next} !($0 in hash)' filter.txt data.txt > op.txt
$ cat op.txt
abc1
abc2
abc3
答案 0 :(得分:1)
如果您有GNU awk或FNR==FNR
,请将ARGIND==1
更改为FILENAME==ARGV[1]
。
$ awk --version | head -1
GNU Awk 4.1.4, API: 1.1 (GNU MPFR 3.1.5, GNU MP 6.1.2)
$ awk 'ARGIND==1{hash[$0]; next} !($0 in hash)' filter.txt data.txt
data2
data3
$ awk --posix 'ARGIND==1{hash[$0]; next} !($0 in hash)' filter.txt data.txt
data1
data1
data2
data3
$ awk --posix 'FILENAME==ARGV[1]{hash[$0]; next} !($0 in hash)' filter.txt data.txt
data2
data3