2015-12-23 99 views
1

我有巨大的文件數量,大約200,000記錄在一個文件中。我一直在測試一些情況,在這些情況下,我必須弄清楚文件的命名模式是否與某些特定的字符串匹配。這裏是我如何前面 -嵌套for循環太慢:1MN記錄遍歷

測試字符串,我存儲在一個文件(假設一個案件,他們是10)。包含字符串記錄的實際文件,以換行符分隔;總計高達20萬條記錄。要檢查大文件中是否存在測試字符串模式,我寫了一個小的嵌套for循環。

for i in `cat TestString.txt` 
do 
for j in `cat LargeFile.txt` 
do 
if [[ $i == $j ]] 
then 
echo "Match" >> result.txt 
fi 
done 
done 

此嵌套循環的實際需要做的遍歷(如果我沒看錯的概念),10x200000倍。通常情況下,我沒有看到服務器上的負載太大,但所花費的時間就像從前一樣。節錄在過去4小時內運行,並且有一些「匹配」結果。

有沒有人有任何想法來加速?我用python或perl touch找到了很多答案,但我老實說在Unix上搜索某些東西。

感謝

+0

您當前的代碼讀取每個循環一個字。當TestString.txt中的10個記錄每個都有20個字時,您將循環執行LargeFile.txt 10x20x200.000次。你多久檢查一次?當LargeFile.txt對每條記錄也有20個字時,您可以進行10x20x200.000x20的比較。 –

+1

您應該將'>> result.txt'移到循環外部,這樣您將不會關閉並打開每個循環的文件。 –

回答

3

嘗試以下操作:

grep -f TestString.txt LargeFile.txt >> result.txt 
+0

我總是忽略grep的力量。完美解決方案謝謝沃爾特。 – knowone

+0

@knowone:當你滿意這個答案時,你可以接受它。 –

+0

完成。道歉,我本來應該做的。 – knowone

1

退房grep

while read line 
do 
    cat LargeFile.txt | grep "$line" >> result.txt 
done < TestString.txt 

grep的將輸出任何匹配的字符串。這可能會更快。請注意,您的TestString.txt文件不應該有任何空行或grep將從LargeFile.txt返回所有內容。

+0

grep是我沒有認真對待:) 這種方法也很好。謝謝羚羊。 – knowone