2013-02-15 57 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