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



我想将一个文件的内容搜索到另一个文件中,并打印匹配的行和第二个文件中匹配的行。第一个文件的内容可以在第二个文件的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 中有多个字符串匹配项,并且我想打印所有这些匹配项怎么办?

提前致谢

如果你有GNU grep

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

你能试试下面的吗?

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

如果这两个文件是fasta格式,你应该尝试使用blast+工具套件进行blastn,该工具套件在性能上进行了优化,并将为您提供有关成对对齐的额外信息(身份率,重叠长度,不匹配次数和间隙(

blastn -query file1 -subject file2 -oufmt 6 > outfile.csv

然后,如果您希望将输出作为第三个fasta文件,请解析结果。

最新更新