perl脚本在multifasta文件中搜索主题并打印完整的序列以及标题行

时间:2011-02-08 05:48:53

标签: perl bioinformatics

我能够在多个fasta文件中搜索图案并打印包含图案的线条....但我需要打印所有序列以及包含fasta序列的图案的标题行。请帮帮我,我只是perl的初学者

#!usr/bin/perl -w
use strict;

print STDOUT "Enter the motif: ";
my $motif = <STDIN>;
chomp $motif;


my $line;
open (FILE, "data.fa");
while ($line = <FILE>) {
  if ($line =~ /$motif/)  {
     print $line;
   }
}

3 个答案:

答案 0 :(得分:3)

试试这个:

Bio::DB::Fasta

页面上的说明。有关更多示例或说明,请搜索Google:“使用Bio :: DB :: Fasta”

要安装它,只需按照以下任何说明操作,我建议使用CPAN.pm方法作为超级用户:

Installing Perl Modules

答案 1 :(得分:2)

上面写的脚本不记得当前的序列标识符,因此您不知道哪个标识符与每个序列相关联。

我已修改下面的脚本,将所有FASTA序列读入一个映射的哈希值(标识符=&gt;序列),然后迭代该哈希值,在适当时打印出匹配项。对于非常大的序列文件来说,这将是一种不合适的方法,但是在编写用于分析数据的新脚本时,学习如何编写这样的小辅助函数可能是一个非常大的加速。了解如何在Perl中使用和操作哈希和其他数据结构也很重要,因为您遇到的大多数代码都不会由初学者编写。

#!/usr/bin/perl

use strict;
use warnings;

print STDOUT "Enter the motif: ";
my $motif = <STDIN>;
chomp $motif;

my %seqs = %{ read_fasta_as_hash( 'data.fa' ) };
foreach my $id ( keys %seqs ) {
    if ( $seqs{$id} =~ /$motif/ ) {
        print $id, "\n";
        print $seqs{$id}, "\n";
    }
}

sub read_fasta_as_hash {
    my $fn = shift;

    my $current_id = '';
    my %seqs;
    open FILE, "<$fn" or die $!;
    while ( my $line = <FILE> ) {
        chomp $line;
        if ( $line =~ /^(>.*)$/ ) {
            $current_id  = $1;
        } elsif ( $line !~ /^\s*$/ ) { # skip blank lines
            $seqs{$current_id} .= $line
        }
    }
    close FILE or die $!;

    return \%seqs;
}

答案 2 :(得分:0)

@ james_thompson的答案很棒。如果你正在寻找更多功能的话,我会用它。如果你正在寻找一个更简单的版本(也许是为了教学?),这也足够了 - 但是请注意,如果在中间有一个很难回归,这将错过主题。

#!usr/bin/perl -w
use strict;

print STDOUT "Enter the motif: ";
my $motif = <STDIN>;
chomp $motif;


my $line;
my $defline;
open (FILE, "data.fa");
while ($line = <FILE>) {
  if ($line =~ /^>/) {
     $defline = $line;
   } elsif ($line =~ /$motif/)  {
     print($defline,$line);
   }
}
close (FILE);

你会注意到我还在文件句柄上添加了一个显式关闭。