【问题标题】:extract FASTA sequence using sequence ID [closed]使用序列 ID 提取 FASTA 序列
【发布时间】:2015-07-12 01:47:53
【问题描述】:

我有两个文件: 文件 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 中适用于我的问题的方式。

【问题讨论】:

  • 欢迎来到 Stack Overflow!这个问题信息量有点少。你能提供你的代码吗?到目前为止,您尝试了什么,遇到了什么问题?另外,您可以减少您发布到与问题相关部分的文件的内容吗?
  • 输出文件,我只得到序列的标题部分,而不是我的文件 1 中的序列和标题。谢谢
  • 实际上我希望在我的输出文件中包含与序列关联的完整标题部分。根据序列id文件检查序列头部分并给出与完整序列关联的输出文件头。
  • 您所需的输出看起来与您的第一个输入文件相同。我错过了什么?
  • 绝对正确的鲍罗丁。最终输出文件包含根据我的序列 id 文件实际匹配标题模式的序列。

标签: perl design-patterns matching


【解决方案1】:

编辑:新代码,第一次没看懂你的问题。该脚本读取这两个文件,将所有 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,只需添加另一个 if 以匹配 ID 与第一个文件中的标题。只要两个文件的顺序相同,这应该可以工作,因为输入在写入时会立即丢弃并且无法再搜索。

【讨论】:

  • 谢谢。我的要求是生成一个包含序列以及与序列 id 文件(即文件 2)的标题匹配的标题部分的单个输出文件。
  • 谢谢,我认为这段代码对我有帮助。
  • 很高兴我能帮上忙。哦,你能点击“接受”来回答我的问题吗?谢谢。
  • Wheee 根据您的建议,我正在编写您的代码并稍作修改。但是输出文件只显示标题部分而不是序列。请检查我的代码并建议我哪里错了。
  • #!/usr/bin/perl -w use strict;我的 $list = $ARGV[0] || 'accessionids.txt';我的 $data = $ARGV[1] || 'fasta.txt';我的 $out = $ARGV[2] || 'SQ.fas';我的 (%ids, $id); open (LIST,$list) or die "无法打开文件 $list: $!\n";而 () { $ids{$_} = 1; } 关闭列表; open (IN, $data) or die "无法打开文件 $data: $!\n";; while () { 我的 $line = $_; if ($line =~ /^>?(\w+\|.+\n)/) { $id = $1; $id =~ tr/|/_/; } } 逼近; open (OUT, ">$outs") or die "无法创建文件 $outs: $!\n"; foreach 我的 $id (@list) { print OUT ">$id\n"; } 关闭;
猜你喜欢
  • 2016-04-12
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多