grep -vf在大文件中速度太慢

5

我正在尝试使用存储在filter.txt文件中的模式从data.txt中筛选数据。就像下面这样:

grep -v -f filter.txt data.txt > op.txt

这个grep命令在filter.txt中有3-4万行,在data.txt中有大约30万行,需要10-15分钟以上的时间。

有没有办法加快速度?

data.txt

data1
data2
data3

filter.txt

data1

op.txt

data2
data3

这个方法可以使用codeforester提供的解决方案,但是当filter.txt为空时会失败。


3
请包含两个文件的示例行。您可能需要查看这篇帖子,该帖子对此问题进行了广泛讨论:https://dev59.com/7lgQ5IYBdhLWcg3wxGzs - codeforester
1
感谢提供的链接。关于类似问题的讨论很有价值。awk 'FNR==NR{hash[$1]; next}$2 in hash' file1.txt FS='|' file2.txt 可以用于匹配行,但需要反转结果。不确定如何使其适用于反向匹配。 - user3150037
1个回答

7

根据Inian相关帖子中的解决方案,这个awk命令应该能够解决你的问题:

awk 'FNR==NR {hash[$0]; next} !($0 in hash)' filter.txt data.txt > op.txt

如果filter.txt为空,但data.txt有行,则此命令将返回空的op.txt文件。在理想情况下,它应该从data.txt返回所有记录。 - user3150037
对我来说运行正常。你的文件中是否有前导/尾随空格? - codeforester
awk语句用于循环并带有一些条件。由于该条件有时会导致filter.txt为空,此时即使data.txt具有数据行,我也会得到空的op.txt。在这种情况下,op.txt应该等于data.txt,因为要匹配的模式为空(filter.txt为空)。 - user3150037
我尝试修复,但我的方法似乎不起作用。希望@karakfa能够帮忙。 - codeforester
1
感谢您的帮助@codeforester。我将发布一个单独的问题,以便更多人可以使用。 - user3150037
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接