【发布时间】:2017-03-10 17:52:41
【问题描述】:
我需要从 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 不为空,则有效。
数据.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
【问题讨论】:
-
您可以使用
ls -s查看文件是否为空,如果匹配为 0,则跳过该文件,或者如果您想要一个全 awk 解决方案,则检查是NR > 2,如果是则仅处理,或类似的(类似于awk 'END{print(NR>2)?"NOT EMPTY":"EMPTY"}'