2017-03-09 46 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

相關問題