从另一个文件中的一个文件中搜索模式,然后将匹配后的行写入第三个文件

时间:2019-09-25 07:07:37

标签: search awk grep

我想将一个文件的内容搜索到另一个文件中,并打印匹配的行以及第二个文件中匹配行之后的行。第一个文件的内容可以在第二个文件的>列下以GN开头的行中找到。我要写匹配的行(从>开始),然后再写具有氨基酸序列的行(以“ M” 开头的大写字母)

文件1:

thrB
yaaX
thrC
dnaK
dnaJ

文件2:

>sp|B1XBC8|KHSE_ECODH Homoserine kinase OS=Escherichia coli (strain K12 / DH10B) OX=316385 GN=thrB PE=3 SV=1
MVKVYAPASSANMSVGFDVLGAAVTPVDGALLGDVVTVEAAETFSLNNLGRFADKLPSEP
>sp|P0AD61|KPYK1_ECOLI Pyruvate kinase I OS=Escherichia coli (strain K12) OX=83333 GN=pykF PE=1 SV=1
MKKTKIVCTIGPKTESEEMLAKMLDAGMNVMRLNFSHGDYAEHGQRIQNLRNVMSKTGKT
>sp|P75616|YAAX_ECOLI Uncharacterized protein YaaX OS=Escherichia coli (strain K12) OX=83333 GN=yaaX PE=3 SV=1
MKKMQSIVLALSLVLVAPMAAQAAEITLVPSVKLQIGDRDNRGYYWDGGHWRDHGWWKQH

我希望输出为:

>sp|B1XBC8|KHSE_ECODH Homoserine kinase OS=Escherichia coli (strain K12 / DH10B) OX=316385 GN=thrB PE=3 SV=1
MVKVYAPASSANMSVGFDVLGAAVTPVDGALLGDVVTVEAAETFSLNNLGRFADKLPSEP
>sp|P75616|YAAX_ECOLI Uncharacterized protein YaaX OS=Escherichia coli (strain K12) OX=83333 GN=yaaX PE=3 SV=1
MKKMQSIVLALSLVLVAPMAAQAAEITLVPSVKLQIGDRDNRGYYWDGGHWRDHGWWKQH

到目前为止,我已经尝试过 grep -F -f file1 file2 仅打印找到匹配项的行

awk我只写过 awk 'NR==FNR{a[$1]++;next}{} file1 file2 我可以打印匹配的行,但此后我不知道如何打印(以“ M”开头)。

有人可以帮助我解决这个问题吗?

非常感谢您的帮助。

另外,如果我的第二个文件在文件1中具有多个字符串匹配项,并且我想打印所有出现的情况怎么办?

预先感谢

2 个答案:

答案 0 :(得分:1)

如果您有GNU grep

grep --no-group-separator -A1 -Ff file1 file2
  • -A1将告诉grep打印匹配行以及下一行
  • 默认情况下,输出组将由--分隔,因此如果您希望避免使用此行,请使用--no-group-separator

答案 1 :(得分:0)

请您尝试以下。

awk '
FNR==NR{
  a[$0]
  next
}
match($0,/GN=[^ ]*/){
  str=substr($0,RSTART+3,RLENGTH-3)
}
(str in a) && /^>/{
  found=1
  val=$0
  next
}
found && /^M/{
  print val ORS $0
}
{
  val=found=""
}
'  Input_file1  Input_file2
相关问题