2014-07-01 81 views
0

我只是要學習一些shell腳本,我真的很努力地獲得我想要的結果frgep。有沒有辦法將fgrep的結果通過管道傳送到文件中,以便將每個模式保存到僅包含屬於這些模式的行的文件中。fgrep:將結果排序到文件

我輸入的文件看起來像:

@ABC;123;bc=Pattern_1; 
@DEF;456;bc=Pattern_1; 
@ZYR;678;bc=Pattern_2; 
@OPZ;888;bc=Pattern_2; 

我的文件,我使用模式搜索的樣子:

Pattern.txt: 
Pattern_1 
Pattern_2 
Pattern_3 

現在我做一個fgrep一樣(我還需要以下3行,每行的條目):

fgrep -A 3 -f Pattern.txt huge_file 

完美地工作。但我想將結果分類到文件中。每個包含Pattern_1的行應該包含在結果文件中,例如Pattern_1.txt。其他模式以相同的方式(pattern_2行應該以pattern_2.txt結尾等等)。

Pattern_1.txt: 
ABC Pattern_1 123 
DEF Pattern_1 456 
... 

Pattern_2.txt: 
ZYR Pattern_2 678 
OPZ Pattern_2 888 
... 

原則上我可以對每個模式進行for循環,每次做一個fgrep並將結果保存到文件中。但是,根據模式,是否有更優雅的方式來管理fgrep的結果?這是相關的,因爲包含該模式的文件非常龐大,需要一段時間才能運行fgrep。 這可能嗎?我在管道後用if子句玩了一段時間,但我無法得到正確的語法來做我想做的事情。這可能嗎?

謝謝。 Carsten

+0

你能提供你在搜索文件的例子嗎? –

+0

非常感謝!我更新了這個問題。輸入格式不是製表符,而是用製表符分隔,每行的開頭有一個@。 – user2251977

回答

0

繼承人一個awk一個班輪,我認爲你需要什麼。

awk 'NR==FNR{a[$1]}{for(i in a){if(i==$2)print $0 >> $2}}' Pattern.txt hugefile 

這應該適用於更新的規格,沒有時間讓它看起來不錯。

awk -F";" 'NR==FNR{a[$0]}{for(i in a){if(i==substr($3,4))print substr($1,2),substr($3,4),$2 >> substr($3,4)}}' Pattern.txt hugefile 

而且略有減少

awk -F";" 'NR==FNR{a[$0]}{x=substr($3,4);for(i in a){if(i==x)print substr($1,2),x,$2 >> x}}' Pattern.txt hugefile 
+0

謝謝!這與我所尋找的非常接近。由於我沒有列表輸入文件(請參閱編輯和更新的問題),if子句是一個問題(我認爲... - 但可能是我錯了)。 – user2251977

+0

是輸入文件中的行總是一樣長嗎? –

+0

不幸的是沒有。 – user2251977