假設你的模式文件有236410行,並假設grep
可以處理輸入的量,和假設輸出文件的順序並不顯著,爲什麼不只是做
grep -f 1.txt 2.txt | awk ... >file1
如果記憶是一個問題,你的輸入是靜態的字符串,嘗試用fgrep
代替;它可以處理更多的圖案。如果輸出的順序實際上很重要,像這樣的事情應該快得多;
while read line; do
grep "$line" 2.txt | awk ...
done <1.txt >file1
根據輸入,您可能需要使用IFS
渣土和/或增加一些選項read
處理空格,反斜線等
如果你只想要輸入的236410條第一線,你可以更改爲
head -n 236410 1.txt |
while read line ...
如果以上都不符合您的要求,這裏有另一個想法。由於您使用awk
的實際處理,無論如何,你也許可以將所有處理的重構爲一個awk
腳本,或動態創建一個sed
腳本,它的輸出傳遞到awk
。這是有點麻煩,而且也取決於你的模式是什麼樣子,但這樣的事情應該給你一個想法:
sed 's%.*%/&/p%' 1.txt | less
你所看到的是一個sed
腳本打印,如果有一個匹配上的每個1.txt
中的模式。 (這將打破,如果任何模式包含一個正斜槓。在這個瑣碎的情況下,在模式使用不同的分隔符,或逃避所有斜槓。)現在,你可以在保存到一個文件,或者(如果您sed
可以處理腳本標準輸入),它傳遞給sed
第二個實例:
sed 's%.*%/&/p%' 1.txt | sed -f - -n 2.txt | less
而這將傳遞給awk
什麼:
sed 's%.*%/&/p%' 1.txt | sed -f - -n 2.txt | awk ... >file1
你'head' /'tail'組合是什麼很慢。 – tripleee
是的,你爲什麼一次只去一條線而不是整條線? – Kevin
我該怎麼辦? – user815408