使用ID从fasta文件中检索DNA序列

时间:2016-01-24 02:03:13

标签: shell awk

我有两个文件,一个只包含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的使用仍然非常基础。我尝试了几次但没有好结果。任何帮助,请

1 个答案:

答案 0 :(得分:0)

AWK脚本

这是一个简单的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.txtfile2.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来测试你的技能。