2012-05-07 36 views
0

我正在尋找在1.txt的一些模式出來2.txt,採用「grep」。然後做一些操作。 然而,似乎「grep」是大文本太慢。替代的grep

for ((i=1; i<=236410; i++)) 
do 
    head -$i 1.txt|tail -1|grep -f - 2.txt|awk '{mul+=$4*$7} END {print $1,$2,$3,mul}' 
done > file1 

我只是想知道任何替代?似乎awk/sed可以做到這一點,但就是不知道該變量head -$i 1.txt|tail -1到AWK或如何管sed的

THX

+1

你'head' /'tail'組合是什麼很慢。 – tripleee

+0

是的,你爲什麼一次只去一條線而不是整條線? – Kevin

+0

我該怎麼辦? – user815408

回答

1

假設你的模式文件有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