2014-04-09 63 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