0

私はPerl正規表現が初めてなので、助けていただければ幸いです。BLAST 出力を解析しています。現時点では、e 値に整数と小数しか含まれていないヒットのみを説明できます。e 値が科学表記法であるヒットを含めるにはどうすればよいですか?

blastoutput.txt

                                                               Score     E
Sequences producing significant alignments:                       (Bits)  Value

ref|WP_001577367.1|  hypothetical protein [Escherichia coli] >...  75.9    4e-15
ref|WP_001533923.1|  cytotoxic necrotizing factor 1 [Escherich...  75.9    7e-15
ref|WP_001682680.1|  cytotoxic necrotizing factor 1 [Escherich...  75.9    7e-15
ref|ZP_15044188.1|  cytotoxic necrotizing factor 1 domain prot...  40.0    0.002
ref|YP_650655.1|  hypothetical protein YPA_0742 [Yersinia pest...  40.0    0.002

ALIGNMENTS
>ref|WP_001577367.1| hypothetical protein [Escherichia coli]

parse.pl

open (FILE, './blastoutput.txt');
my $marker = 0;
my @one;
my @acc;
my @desc;
my @score;
my @evalue;
my $counter=0;
while(<FILE>){
   chomp;
   if($marker==1){
   if(/^(\D+)\|(.+?)\|\s(.*?)\s(\d+)(\.\d+)? +(\d+)([\.\d+]?) *$/) {
   #if(/^(\D+)\|(.+?)\|\s(.*?)\s(\d+)(\.\d+)? +(\d+)((\.\d+)?(e.*?)?) *$/) 
            $one[$counter] = $1;
            $acc[$counter] = $2;
            $desc[$counter] = $3;
            $score[$counter] = $4+$5;
            if(! $7){
                $evalue[$counter] = $6;
            }else{
                $evalue[$counter] = $6+$7;
            }
            $counter++;
        }
    }
    if(/Sequences producing significant alignments/){
        $marker = 1;
    }elsif(/ALIGNMENTS/){
        $marker = 0;
    }elsif(/No significant similarity found/){
        last;
    }
}
for(my $i=0; $i < scalar(@one); $i++){
    print "$one[$i] | $acc[$i] | $desc[$i] | $score[$i] | $evalue[$i]\n";
}
close FILE;
4

3 に答える 3

0

これらの番号の一致を避けることもできます。

while(<FILE>){
    chomp;
    $marker = 0 if $marker and /ALIGNMENTS/;
    if($marker == 1 and my ($r, $w, $d) = split(/[|]/)) {
            my @v = split (/\s+/, $d);
            print "$v[-2]\t$v[-1]\n";
            # some processing ...
    }   
    $marker = 1 if /Sequences producing significant alignments/;
    last        if /No significant similarity found/;
}
于 2013-05-06T05:29:34.710 に答える
0

これが Perl の課題または練習である場合は、他の提案をいくつか取り入れて、最善の解決策を見つけようとします (ただし、そこで終わらないでください。インターネットでも多くの情報が見つかります。 BLAST! の構文解析のトピック)。ただし、実際には、この方法で BLAST レポートを解析することは決してありません。単純なレポート形式が変更される可能性があるため、コードが読み取れなくなり、将来的に機能することが保証されないためです。

XML 出力またはタブ区切りのテーブル形式に固執し、BioPerl を使用Bio::SearchIOしてレポートを解析することを強くお勧めします。たとえば、Bio::SearchIO HOWTOを見ると、Perl の知識がなくても、レポートの特定の部分を選択し、特定の条件でフィルタリングするのは非常に簡単であることがわかります。BioPerl 以外のソリューションを考え出す場合は、タブ区切り形式を検討して、将来の作業を簡単にすることをお勧めします (そうすれば、複雑なタスクを管理しやすく読みやすい方法で実装できます)。

于 2013-05-06T19:40:32.887 に答える