我有两个文件,一个只包含ID,另一个是包含序列的fasta文件(包括ID),file_1中的所有ID都在file_2中。我需要从file_2检索每个ID的完整序列,检索到的序列应该包含完整的seq记录(应该包含标识符后跟序列)
file_1.txt
BGIBMGA000006
BGIBMGA005922
BGIBMGA005925
BGIBMGA008023
BGIBMGA005928
BGIBMGA009805
file_2.fasta
>BGIBMGA000006 BGIBMGA000006-PA B6DXA9 Osiris 18
MARIIVLLSIVAFASATYPASKLVKNIYNECLSQYSVECVKPRTLQWMSSVANDDEIKIT
EDLSIVKTGTVEDDESADPRLAKDPAYEMFDKVDKFLQSHTLRVKVPEEITKSAASEYVP
RSLLTDLPSELDMPLDGEDEAEVVEGRKKKIKLPKPLRIKSKHGFIKKVILPFLLGLKFK
>BGIBMGA000010 BGIBMGA000010-PA B6DXB0 Osiris 9; Uncharacterized
MKCLVVLMVIGVAWAMPAAEQDSDPNILGSVLGVVKECVDGDVTLCLKEKALRYVETLRS
KREITLVDGVTLDSKGSPRSARALEPLPEEPKAREAQVESRLVDGVADFLENYVVQFKLP
>BGIBMGA000012 BGIBMGA000012-PA H9IRZ2 Uncharacterized protein
MLKYIALLALTASVQCNPLKENSISENLVGVISECIERDTSLCIKEKALKFTERLAFSKD
MNIFDGMSLVNIGSARSARSYEPLAEDPKARELQLDERIADNMGDFLENHVIQLRLSEPE
AESRSLDDEARGKKKKKLKQLLPLLLLLKLKLAALIPLFLGIIAFVAVKAVFLGKIAFAM
>BGIBMGA000022 BGIBMGA000022-PA H9IRZ2 Uncharacterized protein
MLKYIALLALTASVQCNPLKENSISENLVGVISECIERDTSLCIKEKALKFTERLAFSKD
MNIFDGMSLVNIGSARSARSYEPLAEDPKARELQLDERIADNMGDFLENHVIQLRLSEPE
AESRSLDDEARGKKKKKLKQLLPLLLLLKLKLAALIPLFLGIIAFVAVKAVFLGKIAFAM
ID BGIBMGA005922的样本输出应为
>BGIBMGA000022 BGIBMGA000022-PA H9IRZ2 Uncharacterized protein
MLKYIALLALTASVQCNPLKENSISENLVGVISECIERDTSLCIKEKALKFTERLAFSKD
MNIFDGMSLVNIGSARSARSYEPLAEDPKARELQLDERIADNMGDFLENHVIQLRLSEPE
AESRSLDDEARGKKKKKLKQLLPLLLLLKLKLAALIPLFLGIIAFVAVKAVFLGKIAFAM
My Awk的使用仍然非常基础。我尝试了几次但没有好结果。任何帮助,请
答案 0 :(得分:0)
这是一个简单的AWK脚本,应该按照我的想法做到(称之为findfasta.awk
):
#!/usr/bin/awk
BEGIN {
while ( getline < "-" ) {
selected[$0] = 1
}
RS=">"
}
$1 in selected {
printf ">%s", $0
}
应该像这样调用:
cat file1.txt | awk -f findfasta.awk file2.txt
它会打印&#34; fasta&#34;的所有记录。文件file2.txt
,其中包含file1.txt
中包含的ID。使用您的file1.txt
和file2.txt
,它会产生:
>BGIBMGA000006 BGIBMGA000006-PA B6DXA9 Osiris 18
MARIIVLLSIVAFASATYPASKLVKNIYNECLSQYSVECVKPRTLQWMSSVANDDEIKIT
EDLSIVKTGTVEDDESADPRLAKDPAYEMFDKVDKFLQSHTLRVKVPEEITKSAASEYVP
RSLLTDLPSELDMPLDGEDEAEVVEGRKKKIKLPKPLRIKSKHGFIKKVILPFLLGLKFK
我假设你的&#34;样本输出&#34;应该为ID BGIBMGA000022
提供什么,并且您BGIBMGA005922
的ID是拼写错误。如果这个假设不正确,请纠正我。
此脚本首先从 stdin ("-"
)中读取行,这是file1.txt
的转储。希望file1.txt
不会太长,因为它必须保存在内存中。数组selected
是一个关联数组。只使用密钥,值可以是任何值(上面使用1
)。我认为它是作为某种哈希表实现的,因此检查包含(in
)应该很快。最大的问题是file1.txt
的大小,因为它必须适合内存中的这种结构。
然后脚本继续输入文件file2.txt
(&#34; fasta&#34;文件)。每条记录由>
分隔。如果记录的第一个字段位于selected
ID中,它将打印整个记录以及替换的>
(已从解析中删除)。
如果你要经常做这样的生物信息学,我建议学习一种更强大,更有效的编程语言。 AWK非常适合短小而简单的东西,我很喜欢它,但它确实有它的局限性。当您开始处理越来越多的数据时,您需要更高效和更具表现力的东西。
有一个名为ROSALIND的精彩网站,专为生物信息学人士设计。它有练习和教程来帮助你学习Python,还有problem set来测试你的技能。