2015-11-01 13 views
0

我對grep命令的輸出有點困惑,它似乎是根據-f FILE的大小截斷結果。例如,考慮字符串的1000行的文件,patterns.txt,例如:爲什麼grep根據我的輸入文件大小顯示不同的輸出?

adkgjwofjdjglkadjglkjasdfahdg 
dsklfjsldkfjaghwioeghsdlkjfld 
sdkljfsdkljghsdlfhkwhfklshdfo 
... 
sdklfjsdklfjsdklfjslkjghdfkjj 

和1Gb的queryfile.txt搜索我的模式。當我運行

grep -F -o -f patterns.txt queryfile.txt | grep -c adkgjwofjdjglkadjglkjasdfahdg 

在這種情況下,該命令報告0匹配的第一線,patterns.txtadkgjwofjdjglkadjglkjasdfahdg),即使有35只出現在queryfile.txt。我通過將patterns.txt文件減少到前10行來驗證了這一點。重新運行

grep -F -o -f patterns_reduced-list.txt queryfile.txt | grep -c adkgjwofjdjglkadjglkjasdfahdg 

正確報告adkgjwofjdjglkadjglkjasdfahdg的35次發生。

發生了什麼事?

+0

適用於我(GNU grep 2.16)。 – dreamlax

+0

你在哪個平臺上運行?你使用的是哪個版本的'grep'?你可以減少你的數據到一個MCVE([如何創建一個最小,完整和可驗證的例子?](http://stackoverflow.com/help/mcve)) 如何創建'first_line_of_patterns.txt'文本到傳遞給'grep'?我認爲它是'$(sed 1q patterns.txt)'的一些變體,但是你應該顯示這一步。 –

+0

@dreamlax:模式的每種可能的變化? :) –

回答

3

這應該不會發生,除非...您的圖案重疊

檢查這個例子:

echo "xyxx" | grep -o -F yx$'\n'xy # output: xy 

此找到第二圖案(xy),而且因爲它不會找到的第一個模式(yx)。

echo "xyxx" | grep -o -F yx   # output: yx 
+0

我修改了原始問題以顯示patterns.txt文件的外觀。它可以很好地結束與patterns.txt中的兩個不同的行,可以匹配queryfile.txt中的同一行。這會被認爲是重疊嗎? – Fatt

+0

不可以。*您不匹配*行*,您匹配部分行(除非這些模式匹配整行)。使用二分搜索縮小模式文件,直到找到與第一個模式重疊的模式。當你刪除所有重疊模式時,你會再次看到35次出現。 –

+0

好的,我想我更瞭解你的答案。你能否給我一兩個關於如何'縮小'(壓縮?)模式文件來執行二進制搜索重疊模式的提示? – Fatt

相關問題