我能够在多个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;
}
}
答案 0 :(得分:3)
试试这个:
页面上的说明。有关更多示例或说明,请搜索Google:“使用Bio :: DB :: Fasta”
要安装它,只需按照以下任何说明操作,我建议使用CPAN.pm方法作为超级用户:
答案 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);
你会注意到我还在文件句柄上添加了一个显式关闭。