使用序列ID提取FASTA序列

时间:2015-05-02 08:44:52

标签: perl design-patterns matching

我有两个文件: 文件1:

84C2_Locus_14_Transcript_1/3_Confidence_0.571_Length_1244
AAACTAGTCAATAGAGAAAATCCAAAGTGGATGAAATTGAAGTGATTGTATGGCACAAGT...so on

>84C2_Locus_14_Transcript_2/3_Confidence_0.857_Length_1961
AAACTAGTCAATAGAGAAAATCCAAAGTGGATGAAATTGAAGTGATTGTATGGCACAAGT...so on

>84C2|Locus_15_Transcript_1/9_Confidence_0.190_Length_757
ATTTGCTCGGAAAAACACTTCTCGTGGAACTTGTTAGCGCTGAGCTTGATCCCAAGACGA.....so on

>84C2_Locus_15_Transcript_5/9_Confidence_0.333_Length_1841
ATTTGCTCGGAAAAACACTTCTCGTGGAACTTGTTAGCGCTGAGCTTGATCCCAAGACGA....so on

File2:只有序列IDS

84C2_Locus_14_Transcript_1/3_Confidence_0.571_Length_1244
84C2_Locus_14_Transcript_2/3_Confidence_0.857_Length_1961
84C2_Locus_14_Transcript_3/3_Confidence_0.571_Length_1248
84C2_Locus_15_Transcript_1/9_Confidence_0.190_Length_757

...........很多。

我的输出文件应包含与标题关联的序列。即将序列id文件头部分与原始fasta序列文件匹配,并且那些序列头部与另一个包含带序列的头部的输出文件中的fasta序列头部存储匹配。就像这样:

原始输出文件应该是这样的:

>84C2_Locus_15_Transcript_5/9_Confidence_0.333_Length_1841
ATTTGCTCGGAAAAACACTTCTCGTGGAACTTGTTAGCGCTGAGCTTGATCCCAAGACGA......so on

请建议我使用perl的方式适用于我的问题。

1 个答案:

答案 0 :(得分:0)

编辑:新代码,我第一次没有理解你的问题。此脚本读取两个文件,将所有ID存储在哈希中,然后遍历第一个文件中的所有序列。只有那些ID在第二个文件中的序列才会被写入输出文件。请注意,输出使用|作为分隔符写入,就像在第一个文件中一样,而不是_,就像第二个文件中的ID一样。第一个文件开头缺少的>也可以正确复制。

#!/usr/bin/perl -w

use strict;

# Check command line arguments
unless ($#ARGV == 1 && -e $ARGV[0] && -e $ARGV[1]) {
        print STDERR "Usage: split-fasta.pl DATA IDS\n";
        exit 1;
}

my (%ids, $id);

# Read sequence IDs
open(IDS, "<$ARGV[1]") or die "Can't open IDs file: $1";

while (<IDS>) {
        $ids{$_} = 1;
}

close(IDS);


# Read sequence data and write results to output.fasta
open(DATA,    "<$ARGV[0]") or die "Can't open sequences file: $1";
open(OUTFILE, ">>output.fasta") or die "Can't open output file: $1";

while (<DATA>) {
        my $line = $_;


        if ($line =~ /^>?(\w+\|.+\n)/) {
                $id = $1;
                $id =~ tr/|/_/;
        }

        print OUTFILE $line if defined $ids{$id};
}

close(DATA);
close(OUTFILE);

那么,你基本上想要将文件1分成多个文件,每个文件只包含一个序列?也许这个丑陋的(可能关闭每个文件句柄,而不仅仅是最后一个...)Perl的一块将帮助你。

#!/usr/bin/perl -w

use strict;

while (<>) {
        my $line = $_;

        if ($line =~ />?([0-9]+|\w+)\//) {
                my $file_name = $1;
                open(OUTFILE, ">>$file_name");
        }

        print OUTFILE $line;
}

close(OUTFILE);

编辑:如果您想从第二个文件中输入ID,只需添加与ID匹配的另一个if和第一个文件中的标头文件。只要两个文件的顺序相同,这应该有效,因为输入在写入时立即被丢弃,不能再被搜索。

相关问题