0

我已经开始使用 linux 机器,我正在尝试做一些简单的事情……但对我来说很难。我需要选择一些与第二个文件中报告的行相匹配的特定行。实际上,我有一个像这样制作的第一个文件:

>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

实际上,我希望有这样的输出:

>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

我试过grep -f file_2 file_1 > output但我只得到这个:

>clat38
>coll9

我可以添加一些更具体到 grep 的内容吗?感谢您的任何建议!瞎扯

4

4 回答 4

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
于 2013-02-15T13:15:38.497 回答
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 语句来删除多余的 -- 行。

于 2013-02-15T13:20:16.757 回答
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
于 2013-02-15T13:14:46.517 回答
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
> 
于 2013-02-15T13:40:44.233 回答