2017-03-09 132 views
3

我试图使用存储在文件filter.txt中的模式从data.txt中过滤数据。如下图所示,grep -vf对于大文件来说太慢

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

这grep的时间超过10-15分钟30-40K线filter.txt和300K〜行data.txt中。

有什么办法可以加快这个速度吗?

的data.txt

data1 
data2 
data3 

filter.txt

data1 

op.txt

data2 
data3 

这适用于由codeforester提供的解决方案,但在filter.txt是空的失败。

+3

请包括来自这两个文件样本线。你可能想看看这个帖子,这个帖子对这个问题有广泛的讨论:http://stackoverflow.com/questions/42239179/fastest-way-to-find-lines-of-a-text-file-from-另一个更大的文本文件在bash – codeforester

+0

感谢您的链接。关于类似问题的良好讨论。 awk'FNR == NR {hash [$ 1];下一个} $ 2在散列'file1.txt FS ='|' file2.txt适用于匹配行,但需要反转结果。不知道如何使它适用于反转匹配。 – user3150037

回答

4

根据在relatedInian's的解决方案,这awk命令应该解决您的问题:

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

是的。找到了 。谢谢:) – user3150037

+0

如果filter.txt为空,但data.txt有行,则此命令返回空op.txt文件。在理想的情况下,它应该从data.txt中返回所有记录 – user3150037

+0

对我来说正确工作。文件中是否有前/后空格? – codeforester

相关问题