2013-02-15 16 views
0

我已經開始使用Linux機器,我正在嘗試做簡單的事情......但對我來說非常困難。 我需要選擇一些與第二個文件中報告的行匹配的特定行。 Pratically我有一個由這樣的第一個文件:grep或awk匹配一條線和以下具有特定模式

>aba19 EN1 enl.or11 http://mar2043 annotation not avaliable 
MASESEMGVVASJDHAGISFGVDDASDASDAFGDFGHWFACFQLIGIFLAYCLSRAITNN 
QSDHKAJSDHKASJHKJAHKHKJSDGHYEIV 
>clat38 EN2 enl.o http://mar20s/Gene/Summary?5 annotation not avaliable 
MNCEDCHILNAEAFKSKKDASDADICKSLKICGLVFGILALTLIVLFWGSKHFWPEVPKK 
AYDMEHTFYSNGERGYCCASDSDDIYCSDRRGNRYCRRVCEPLLGYYPYPYCYQGGRVIC 
RVIMPCDASDASDAOPWEIPQWFHNDJBVHAOISDOUIAODGNWWVARMLGRV 
>coll9 EN4 ens4 http://mar2010.arch/Genary?g=E9 annotation not avaliable 
MASKALDHLFKLJLÒFJASDJKLASDLAFJLFJFJLFJLAJFLKJFLAKFJFJLAFJLAL 
ASDLASKDJASLKDJASLKJFALSKDJALKDJSKLDJLSDKJASLDKJSLDKSDLAKJKS 
SILDUAISDALSDJALKDJASDLFATT 
>hihi9 EN9 ens44 http://mar2010.ariens/Geary?g=EN7 annotation not avaliable 
MGSLDLAÈPWOEMWBZMKSJDHAJKSDHAKSDHSDHSDHOASDAKSJDHKASJDHAAKHL 
KTLSDKLHRFSDFHPHFGCJLJLJRKKFLDSFCGTVGEFAGGGDTHNNVCLSSVFVSEDG 
HSDFSDWFKLGGMETVCSDFKVSQATPEFSSSDLFFDSRIQSIRDPASIPPEEMSPEFTT 
LPECHGHARDAFSFGTLVESLLTILNEQVSADVLSSFQQTLHSTLLNPIPKCRPALCTLL 
SDFLSDJFKLSDFLSKDFJM 

我必須跟的,我需要從第一個文件中「提取」模式列表中的第二個文件。第二個文件是這樣的:

>clat38 
>coll9 

Pratically我想有一個像這樣的輸出:

>clat38 EN2 enl.o http://mar20s/Gene/Summary?5 annotation not avaliable 
MNCEDCHILNAEAFKSKKDASDADICKSLKICGLVFGILALTLIVLFWGSKHFWPEVPKK 
AYDMEHTFYSNGERGYCCASDSDDIYCSDRRGNRYCRRVCEPLLGYYPYPYCYQGGRVIC 
RVIMPCDASDASDAOPWEIPQWFHNDJBVHAOISDOUIAODGNWWVARMLGRV 
>coll9 EN4 ens4 http://mar2010.arch/Genary?g=E9 annotation not avaliable 
MASKALDHLFKLJLÒFJASDJKLASDLAFJLFJFJLFJLAJFLKJFLAKFJFJLAFJLAL 
ASDLASKDJASLKDJASLKJFALSKDJALKDJSKLDJLSDKJASLDKJSLDKSDLAKJKS 
SILDUAISDALSDJALKDJASDLFATT 

我tryed grep -f file_2 file_1 > output,但我只得到這樣的:

>clat38 
>coll9 

我可能添加更多特定於grep的內容? 謝謝你的任何建議! 加布

+1

更新您的預計產量,因爲你不能從你更新的輸入文件輸出。另外 - 你是否還想在你的關鍵值之後獲得第一行,或者你現在是否需要將所有行取出下一個關鍵值? – 2013-02-15 14:04:04

+0

@EdMorton我需要得到第一行,剩下的就是下一個關鍵值! – Gabelins 2013-02-15 14:10:39

回答

2

要搜索的正則表達式在同一行,使用grep。從手冊頁和幾個示例中瞭解它。

要在單行上將字符串替換爲正則表達式,請使用sed。從手冊頁和幾個示例中瞭解它。

對於所有其他文本處理應用程序,請使用awk。通過Arnold Robbins的書籍「Effective Awk Programming,Third Edition」,http://www.oreilly.com/catalog/awkprog3/瞭解它。

awk 'NR==FNR{a[$0];next} $1 in a{c=2} c&&c--' file2 file1 

如果你要打印出超過2行,當你找到你想要的關鍵,只是c的值更改爲3或20或什麼的。

下面給出您的評論和更新後的樣本輸入,這應該做你想做的:

awk 'NR==FNR{a[$0];next} /^>/{f=0} $1 in a{f=1} f' file2 file1 
+0

+1您對getline的好評。 – Kent 2013-02-15 13:34:11

+0

@Ed Morton問題是,在我的情況下c在行之間變化... – Gabelins 2013-02-15 14:06:28

+1

@Gabelins我剛剛更新了我的答案。 – 2013-02-15 14:09:48

0

一個awk的一班輪應該爲你工作:

awk 'NR==FNR{a[$0];next}{x=$0;getline;if(x in a)print x"\n"$0}' file2 file1 

kent$ head file1 file2 
==> file1 <== 
>aba19 
ALKSDJASDKASDLKASDL 
>clat38 
PDASODJADASLDKALSKDLACASDLKAJ 
>coll9 
AOSODADALSDKALDKASLDSAK 
>hihi9 
JHASDASDJOASDJAOSD 

==> file2 <== 
>clat38 
>coll9 

kent$ awk 'NR==FNR{a[$0];next}{x=$0;getline;if(x in a)print x"\n"$0}' file2 file1 
>clat38 
PDASODJADASLDKALSKDLACASDLKAJ 
>coll9 
AOSODADALSDKALDKASLDSAK 
+0

如果您正在考慮使用getline,請確保您已閱讀http://awk.info/?tip/getline並完全理解所有注意事項,以便了解指向您腳的槍的類型:-) 。 – 2013-02-15 13:16:54

+0

@Kent我試了一下,但輸出文件是空的:( – Gabelins 2013-02-15 13:19:22

+0

@Gabelins沒有輸出文件,請檢查編輯答案 – Kent 2013-02-15 13:22:25

1

從grep的手冊頁:

-A NUM, --after-context=NUM 
      Print NUM lines of trailing context after matching lines. 
      Places a line containing -- between contiguous groups of 
      matches. 

因此,在這種情況下,只需添加-A1應該工作。

從意見,更好的解決辦法是:

grep -xFA1 -f file_2 file_1 | grep -v "^\--"

-x匹配整行

-F治療模式字符串而不是正則表達式

我不得不添加第二的grep聲明刪除額外的行。

+0

在密鑰文件中使用> clat3並在另一個文件中同時使用> clat3和> clat38。 – 2013-02-15 13:24:25

+0

好點。我想你需要添加'-x'來確保整行匹配。 – 2013-02-15 13:32:35

+0

您還需要添加-f以確保您正在進行字符串比較而不是RE比較,並且可能還需要添加其他一些標誌。這不是一個可怕的grep使用,但是,你必須考慮一下,以確保你正確地得到所有選項,或者最終得到一些對你的示例輸入有效的東西,但在稍後的使用中會加密失敗。 – 2013-02-15 13:40:15

0
awk 'FNR==NR{a[$0];next}{for(i in a)if(i==$0){print;getline;print}}' second_file first_file 

以下測試:

> cat temp 
>aba19 
ALKSDJASDKASDLKASDL 
>clat38 
PDASODJADASLDKALSKDLACASDLKAJ 
>coll9 
AOSODADALSDKALDKASLDSAK 
>hihi9 
JHASDASDJOASDJAOSD 

> cat temp2 
>clat38 
>coll9 

> awk 'FNR==NR{a[$0];next}{for(i in a)if(i==$0){print;getline;print}}' temp2 temp 
>clat38 
PDASODJADASLDKALSKDLACASDLKAJ 
>coll9 
AOSODADALSDKALDKASLDSAK 
> 
+1

低效率的數組使用和看到關於getline的評論elsethread。 – 2013-02-15 13:42:44