2011-09-30 75 views
2

我想從List_2(100k行)中減去List_1(50k行),當List_1中的項目與List_2中的項目完全匹配時。我使用grep,具體如下:從另一個列表中減去一個列表的最有效方法是什麼?

grep -v -f List_1.csv List_2.csv > Magic_List.csv

我知道這是不是這樣做的最有效方法,但究竟是什麼? sedawkcomm? SQL?我怎樣才能以最有效的方式完成這項工作?

+0

在你的csv中,你是否在刪除任何行上的任何項目?或者是逐行比較? – aus

+0

取決於您如何爲列表定義「減少」。將列表視爲集合?或者列表中是否包含重複項並且與訂單相關? –

回答

4

這是最有效的方式之一恕我直言,你需要添加-F雖然:

grep -Fvf List_1.csv List_2.csv > Magic_List.csv 
+0

爲什麼這會節省時間? (我不與你爭論,我很好奇:)) – ralphthemagician

+0

因爲它不搜索正則表達式,但只適用於固定字符串,它也被稱爲快速grep ... –

+0

我要給這個一試。我可以期待什麼樣的速度增加?任何想法? – ralphthemagician

1

最有效的方法是使用一個特里數據結構或第二列表中的散列函數和爲第一個列表中的每個項目在您的特里搜索。

+0

我不是100%在這裏。我該怎麼做? – ralphthemagician

+0

一個trie是一個強大的數據結構。總的來說,可以根據一些規則和分層數據結構以及減法來構建所有數學。 – Bytemain

0

您必須對其進行基準測試才能找到最有效的方法。這是,但是,comm是什麼,所以我想這將是一個漂亮的工具。

comm -13 List_1.csv List_2.csv > Magic_List.csv 
+1

需要注意的是,comm對排序後的輸入進行操作:'comm - 逐行比較兩個排序後的文件。 –

+0

啊,真的,好點,我經常忘記。 –

相關問題