2014-04-09 65 views
0

我有一个文件有多个字符串;说data.fa.搜索主题打印标题

sp|P08246|ELNE_HUMAN Neutrophil elastase OS=Homo sapiens GN=ELANE PE=1 SV=1 
MTLGRRLACLFLACVLPALLLGGTALASEIVGGRRARPHAWPFMVSLQLRGGHFCGATLI 
APNFVMSAAHCVANVNVRAVRVVLGAHNLSRREPTRQVFAVQRIFENGYDPVNLLNDIVI 
LQLNGSATINANVQVAQLPAQGRRLGNGVQCLAMGWGLLGRNRGIASVLQELNVTVVTSL 
CRRSNVCTLVRGRQAGVCFGDSGSPLVCNGLIHGIASFVRGGCASGLYPDAFAPVAQFVN 
WIDSIIQRSEDNPCPHPRDPDPASRTHGGGGNGVQCLAMGWG 
sp|P31689|DNJA1_HUMAN DnaJ homolog subfamily A member 1 OS=Homo sapiens GN=DNAJA1 PE=1 SV=2 
MVKETTYYDVLGVKPNATQEELKKAYRKLALKYHPDKNPNEGEKFKQISQAYEVLSDAKK 
RELYDKGGEQAIKEGGAGGGFGSPMDIFDMFFGGGGRMQRERRGKNVVHQLSVTLEDLYN 
GATRKLALQKNVICDKCEGRGGKKGAVECCPNCRGTGMQIRIHQIGPGMVQQIQSVCMEC 
QGHGERISPKDRCKSCNGRKIVREKKILEVHIDKGMKDGQKITFHGEGDQEPGLEPGDII 
sp|P10144|GRAB_HUMAN Granzyme B OS=Homo sapiens GN=GZMB PE=1 SV=2 
MQPILLLLAFLLLPRADAGEIIGGHEAKPHSRPYMAYLMIWDQKSLKRCGGFLIRDDFVL 
TAAHCWGSSINVTLGAHNIKEQEPTQQFIPVKRPIPHPAYNPKNFSNDIMLLQLERKAKR 
TRAVQPLRLPSNKAQVKPGQTCSVAGWGQTAPLGKHSHTLQEVKMTVQEDRKCESDLRHY 
YDSTIELCVGDPEIKKTSFKGDSGGPLVCNKVAQGIVSYGRNNGMPPRACTKVSSFVHWI 
KKTMKRYGNGVQCLAMGWG 

我想打印头和没有图案(GNGVQCLAMGWG)如果对任何一个输出文件。 是啊!这里是一个新手。我有以下代码

#!/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; 
} 

我期待输出如下:

sp|P08246|ELNE_HUMAN Neutrophil elastase OS=Homo sapiens GN=ELANE PE=1 SV=1: 02 
sp|P10144|GRAB_HUMAN Granzyme B OS=Homo sapiens GN=GZMB PE=1 SV=2: 01 

我需要帮助。

回答

0

所以,在这里:

if ($seqs{$id} =~ /$motif/) { 
    print $id, "\n"; 
    print $seqs{$id}, "\n"; 
} 

你靠近关口,但这样做不必要的工作。如果所有我们需要的是number of matches,我们可以做简单的计数和format the result,让您的前导零:

my $matches =() = $seqs{$id} =~ /$motif/g; 
if ($matches > 0) { 
    my $matches_string = sprintf('%02d', $matches); 
    print "$id: $matches_string\n"; 
} 

顺便说一句,如果有这么$motif永远不会包含正则表达式元字符任何机会(你不妨假设它可以),你可以escape it

#not escaped 
/$motif/g 

#escaped 
/\Q$motif\E/g 

最后,你需要在任何特定的顺序的结果?键操作员并不保证您将按照插入的顺序将键取出。

+0

不是真的,但最优选的部分是输出顺序,即 – user3489854

+0

不是,但最优选的部分是输出顺序,即> FASTA_header1:图案的数量 – user3489854

+0

某些功能很难适合我脑。你可以请输入实际的脚本让我运行。谢谢拉特。 – user3489854