【问题标题】:Extract FASTA sequences from a file based on sequence IDs根据序列 ID 从文件中提取 FASTA 序列
【发布时间】:2018-10-23 18:47:24
【问题描述】:

我有两个文件。 seq.fasta 由 FASTA 序列组成,ids.txt 包含要从 seq.fasta 中提取的序列的 ID

例如

seq.fasta

>AUP4056.1
MFKSLIQFFKSKSNTSNIKKENAVQRQERQDIEGWITPYSGQELLNTELRQHHLGLLWQQVSMTREMFEH
LYQKPIERYAEMVQLLPASESHHHSHLGGMLDHGLEVISFAAKLRQNYVLPLNAAPEDQAKQKDAWTAAV
IYLALVHDIGKSIVDIEIQLQDGKRWLAWHGIPTLPYKFRYIKQRDYELHPVLGGFIANQLIAKETFDWL
ATYPEVFSALMYAMAGHYDKANVLAEIVQKADQNSVALALGGDITKLVQKPVISFAKQLI`
>XIM5213
FKISSKGPGDGWLTEDGLWLMSKTTADQIRAYLMGQGISVPSDNRKLFDEMQAHRVIESTSEGNAIWYCQ
LSADAGWKPKDKFSLLRIKPEVIWDNIDDRPELFAGTICVVEKENEAEEKISNTVNEVQDTVPINKKENI
ELTSNLQEENTALQSLNPSQNPEVVVENCDNNSVDFLLNMFSDNNEQQVMNIPSADAEAGTTMILKSEPE
NLNTHIEVEANAIPKLPTNDDTHLKSEGQKFVDWLKD
>bcna2598.1
GPGDGWLTEDGLWLMSKTTADQIRAYLMGQGISVPSDNRKLFDEMQAHRVIESTSEGNAIWYCQ
LSADAGWKPKDKFSLLRIKPEVIWDNIDDRPELFAGTICVVEKENEAEEKISNTVNEVQDTVPINKKENI
ELTSNLQEENTALQSLNPSQNPEVVVENCLPTNDDTHLKSEGQK

ids.txt

AUP4056.1 bcna2598.1 YUP42568 CAD42579.3 
JIK6023.5 ZNB708645

我尝试了以下程序作为答案 How to extract FASTA sequences from a file using sequence IDs in a different file? 但它只是将seq.fasta 文件复制到输出。

Perl 代码

#!/usr/bin/env perl

use strict;
use warnings;

open ( my $id_file, '<', 'ids.txt' ) or die $!;
#use split here, to split any lines on whitespace. 
chomp ( my @ids = map { split } <$id_file> );
close ( $id_file );

my %sequences;

open ( my $input, '<', 'seq.fasta' ) or die $!;

{
   local $/ = '';    #paragraph mode; Read until blank line

   while ( <$input> ) {
      my ( $id, $sequence ) = m/>\s*(\S+)\n(.*)/ms;
      $sequences{$id} = $sequence;
   }
}

foreach my $id ( @ids ) {

   if ( $sequences{$id} ) {
      print ">$id\n";
      print "$sequences{$id}\n";
   }
}

close ($input);
exit;

谁能告诉我哪里出错了?

更新:

我想将输出存储在一个单独的文件中。

【问题讨论】:

  • 阅读您自己的 cmets:#paragraph mode; Read until blank line。您的输入没有空行,因此&lt;$input&gt; 会读取整个文件。

标签: perl fasta


【解决方案1】:

您使用的代码适用于在序列之间有空行的 FASTA 文件。你的没有,所以它失败了

这应该可以正常工作,虽然我无法测试它

use strict;
use warnings 'all';

my %ids = do {
    open my $fh, '<', 'ids.txt'
            or die qq{Unable to open "ids.txt" for input: $!};
    local $/;
    map { $_ => undef } split ' ', <$fh>;
};

open my $fh, '<', 'seq.fasta'
        or die qq{Unable to open "seq.fasta" for input: $!};

my $print;
while ( <$fh> ) {
    $print = exists $ids{$1} if /^>(\S+)/;
    print if $print;
}

【讨论】:

  • 您能告诉我如何将输出定向到文件吗?
猜你喜欢
  • 1970-01-01
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多