我想将一个文件的内容搜索到另一个文件中,并打印匹配的行和第二个文件中匹配的行。第一个文件的内容可以在第二个文件的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文件,请解析结果。