grep或awk将一条线和以下内容与特定图案匹配

grep或awk将一条线和以下内容与特定图案匹配,awk,grep,Awk,Grep,我已经开始使用linux机器,我正在尝试做一些简单的事情…但对我来说很难。 我需要选择一些与第二个文件中报告的行相匹配的特定行。 实际上,我有一个这样制作的第一个文件: >aba19 EN1 enl.or11 http://mar2043 annotation not avaliable MASESEMGVVASJDHAGISFGVDDASDASDAFGDFGHWFACFQLIGIFLAYCLSRAITNN QSDHKAJSDHKASJHKJAHKHKJSDGHYEIV >

我已经开始使用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
我还有第二个文件,其中有我需要从第一个文件中“提取”的模式列表。第二个文件如下所示:

>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
实际上,我希望有这样的输出:

>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\u 2 file\u 1>输出
,但我只得到以下结果:

>clat38
>coll9
我可以为grep添加更具体的内容吗? 谢谢你的建议!
Gab

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
awk'NR==FNR{a[$0];next}{x=$0;getline;if(a中的x)打印x“\n”$0}”文件2文件1
肯特$头文件1文件2
==>文件1 aba19
Alksdjasdkasdl
>第38条
PDASODJADASLDKALSKDLACASDLKAJ
>coll9
AOSODADALSDKALDKASLDSAK
>hihi9
JHASDASDJOASDJAOSD
==>文件2类38
>coll9
kent$awk'NR==FNR{a[$0];next}{x=$0;getline;if(a中的x)打印x“\n”$0}”文件2文件1
>第38条
PDASODJADASLDKALSKDLACASDLKAJ
>coll9
AOSODADALSDKALDKASLDSAK

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
awk'NR==FNR{a[$0];next}{x=$0;getline;if(a中的x)打印x“\n”$0}”文件2文件1
肯特$头文件1文件2
==>文件1 aba19
Alksdjasdkasdl
>第38条
PDASODJADASLDKALSKDLACASDLKAJ
>coll9
AOSODADALSDKALDKASLDSAK
>hihi9
JHASDASDJOASDJAOSD
==>文件2类38
>coll9
kent$awk'NR==FNR{a[$0];next}{x=$0;getline;if(a中的x)打印x“\n”$0}”文件2文件1
>第38条
PDASODJADASLDKALSKDLACASDLKAJ
>coll9
AOSODADALSDKALDKASLDSAK

要在单行上搜索正则表达式,请使用grep。从手册页和几个例子中学习

要用字符串替换单行上的正则表达式,请使用sed。从手册页和几个例子中学习

对于所有其他文本处理应用程序,请使用awk。从Arnold Robbins的《有效的Awk编程,第三版》一书中学习

如果要在找到所需的键时打印超过2行,只需将c的值更改为3或20或其他任何值

鉴于您在下面的评论和更新的示例输入,这应该满足您的要求:

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

要在单行上搜索正则表达式,请使用grep。从手册页和几个例子中学习

要用字符串替换单行上的正则表达式,请使用sed。从手册页和几个例子中学习

对于所有其他文本处理应用程序,请使用awk。从Arnold Robbins的《有效的Awk编程,第三版》一书中学习

如果要在找到所需的键时打印超过2行,只需将c的值更改为3或20或其他任何值

鉴于您在下面的评论和更新的示例输入,这应该满足您的要求:

awk 'NR==FNR{a[$0];next} /^>/{f=0} $1 in a{f=1} f' file2 file1
从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文件\u 2文件\u 1 | grep-v“^\-”

-x
匹配整行

-F
将模式视为字符串而不是正则表达式

我不得不添加第二条grep语句来删除额外的--line.

从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文件\u 2文件\u 1 | grep-v“^\-”

-x
匹配整行

-F
将模式视为字符串而不是正则表达式

我不得不添加第二条grep语句来删除多余的--行

测试如下:

> 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
> 
测试如下:

> 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
> 


如果您正在考虑使用getline,请确保您已经阅读并完全理解了所有的注意事项,以便知道您所指的是哪种类型的枪:-)。@Kent我尝试过,但输出文件是空的:(@EdMorton thx获取信息。我用错了吗?你能指出吗?很高兴知道并学习。提前谢谢你。@Kent是的……无论如何,我没有得到任何结果。这不是getline有用或合适的情况。它会导致比不使用getline更长的答案,并且你无法明智地增强它以打印10行(再添加9条getlines?)或在它读取的记录上执行其他操作(因为绕过了主体工作循环)。要继续…如果您正在考虑使用getline,请确保您已经阅读并完全理解所有的注意事项,以便知道您指向脚的是哪种枪:-)。@Kent我尝试过,但输出文件是空的:(@EdMorton thx获取信息。我用错了吗?你能指出吗?很高兴知道并学习。提前谢谢你。@Kent是的……无论如何,我没有得到任何结果。这不是getline有用或合适的情况。它会导致比不使用getline更长的答案,并且你无法明智地增强它以打印10行(再添加9条getline?)或对其读取的记录执行其他操作(因为绕过了主体工作循环)。要继续…请在密钥文件中使用>clat3,在另一个文件中同时使用>clat3和>clat38。这一点很好。我想您需要添加
-x
,以确保整行匹配。您还需要添加-f,以确保您正在进行字符串比较,而不是重新比较,并且可能需要添加一些其他标志。不过,使用grep并不可怕,你只需要仔细考虑一下,以确保所有选项都正确,否则你最终会得到一个对你的示例输入有效但在以后的使用中会神秘地失败的东西……现在OP已经更新了他的帖子,你需要删除-x并做一些其他事情,因为现在这个键刚刚出现在数据文件中的行的开头。对问题的最新编辑会中断此解决方案,因为整行匹配将不再有效。您可以通过将-x替换为-w以匹配整行文字来解决此问题,但awk解决方案可能更易于维护。编辑: