2013-03-04 94 views
0

我想解析一個GBK文件。基本上,我需要返回匹配模式的基因座位標籤和產品名稱。因此,如果主題我想搜索所有預測基因產物,檢索詞「預言」將返回:如何解析匹配文件,並在Perl中匹配字符串之前打印字符串?

/product="predicted semialdehyde dehydrogenase" 
/locus_tag="ECDH10B_2481" 

我已經能夠返回/product但我無法弄清楚如何解析「向後「來抓取/locus_tag

這是我到目前爲止有:

my $fasta_file = 'example.txt'; 
open(INPUT, $fasta_file) || die "ERROR: can't read input FASTA file: $!"; 
while (<INPUT>) { 
    if(/predicted/){ 
      print $_; 
    } 
} 

>將example.txt

gene   complement(2525423..2526436) 
       /gene="usg" 
       /locus_tag="ECDH10B_2481" 
CDS    complement(2525423..2526436) 
       /gene="usg" 
       /locus_tag="ECDH10B_2481" 
       /codon_start=1 
       /transl_table=11 
       /product="predicted semialdehyde dehydrogenase" 
       /protein_id="ACB03477.1" 
       /db_xref="GI:169889770" 
       /db_xref="ASAP:AEC-0002184" 
       /translation="MSEGWNIAVLGATGAVGEALLETLAERQFPVGEIYALARNESAG 
       EQL" 
gene   complement(2526502..2527638) 
       /gene="pdxB" 
       /locus_tag="ECDH10B_2482" 
CDS    complement(2526502..2527638) 
       /gene="pdxB" 
       /locus_tag="ECDH10B_2482" 
       /codon_start=1 
       /transl_table=11 
       /product="erythronate-4-phosphate dehydrogenase" 
       /protein_id="ACB03478.1" 
       /db_xref="GI:169889771" 
       /db_xref="ASAP:AEC-0002185" 
       /translation="MKILVDENMPYARDLFSRLGEVTAVPGRPIPVAQLADADALMVR 
       SVTKVNESLLAGKPIKFVGTATAGTDHVDEAWLKQAGIGFSAAP" 
+0

「基因」和「CDS」前面的額外空間是否是一個錯字? – Schwern 2013-03-04 20:40:35

+0

這看起來不像FASTA格式,那是什麼格式?可能有一個現有的解析器可以使用。 – Schwern 2013-03-04 20:57:10

+0

對不起,這是GBK格式。 – Stephen 2013-03-05 21:41:01

回答

1

只記得遇到的最後一個座位標籤,如果預測打印:

#!/usr/bin/perl 
use warnings; 
use strict; 

my $fasta_file = 'example.txt'; 
open my $INPUT, '<', $fasta_file or die "ERROR: can't read input FASTA file: $!"; 

my $locus_tag; 
while (<$INPUT>) { 
    if (/locus_tag/) { 
     $locus_tag = $_; 
    } elsif (/predicted/) { 
     print; 
     print $locus_tag; 
    } 
} 
1

你不應該 「解析倒退」。您的/locus標記是事件,匹配是另一個。你的邏輯應該運行

  1. 您捕捉每個座位標籤,並​​將其儲存
  2. 當你匹配,座位標籤存儲在門將列表
  3. 當你存儲的最後一個座位標籤將自動重挫下一個。
+0

我也想過這個。如果該文件包含數十萬條記錄,並且您存儲了每一個標籤,我認爲這會顯着阻礙腳本的性能。我會試試看看。 – Stephen 2013-03-04 20:39:20

+0

@ user1854603,您將每個存儲在'$ current_locus_tag'之類的東西中。這是一個標量,所以它只需要一個值。然後當你匹配時,你可以存儲它或打印它。如果您存儲它,您可以稍後更改您的操作。 – Axeman 2013-03-04 20:43:23

0

它很難向後解析。通過解析每個完整的條目,然後確定它是否匹配,您會得到更好的服務。現在有更多的工作要做,但當你想用基因數據做其他事情時,它會證明是非常有用的。

我在下面使用的方法構建了%entry中的條目。當它看到下一個「基因」行時,它會處理該條目,在這種情況下檢查產品匹配,並將其清除,以供下一條匹配。

我已經使用了DATA文件句柄用於測試目的,它讀取__DATA__行後的所有內容。

#!/usr/bin/env perl 
use v5.10; 
use strict; 
use warnings; 

my %entry; 
while(my $line = <DATA>) { 
    # new entry, process the previous one and clear it 
    if($line =~ m{^ gene \s+ complement \((.*) \) }x) { 
     process_entry(\%entry) if keys %entry; 
     %entry = (complement => $1); 
    } 
    elsif($line =~ m{^CDS \s+ }x) { 
     # ignore CDS lines for now 
    } 
    elsif($line =~ m{^\s+/(\w+)=(.*)}) { 
     $entry{$1} = $2; 
    } 
    else { 
     warn "Unknown line $line"; 
    } 
} 

# Process the last one. 
process_entry(\%entry) if keys %entry; 

sub process_entry { 
    my $entry = shift; 

    say "MATCH! $entry->{locus_tag}" if $entry->{product} =~ /predicted/; 

    return; 
} 


__DATA__ 
gene   complement(2525423..2526436) 
       /gene="usg" 
       /locus_tag="ECDH10B_2481" 
CDS    complement(2525423..2526436) 
       /gene="usg" 
       /locus_tag="ECDH10B_2481" 
       /codon_start=1 
       /transl_table=11 
       /product="predicted semialdehyde dehydrogenase" 
       /protein_id="ACB03477.1" 
       /db_xref="GI:169889770" 
       /db_xref="ASAP:AEC-0002184" 
       /translation="MSEGWNIAVLGATGAVGEALLETLAERQFPVGEIYALARNESAGEQL" 
gene   complement(2526502..2527638) 
       /gene="pdxB" 
       /locus_tag="ECDH10B_2482" 
CDS    complement(2526502..2527638) 
       /gene="pdxB" 
       /locus_tag="ECDH10B_2482" 
       /codon_start=1 
       /transl_table=11 
       /product="erythronate-4-phosphate dehydrogenase" 
       /protein_id="ACB03478.1" 
       /db_xref="GI:169889771" 
       /db_xref="ASAP:AEC-0002185" 
       /translation="MKILVDENMPYARDLFSRLGEVTAVPGRPIPVAQLADADALMVRSVTKVNESLLAGKPIKFVGTATAGTDHVDEAWLKQAGIGFSAAP" 

替代地有幾個Fasta readers on CPAN包括Bio::SeqReader::FastaBio::DB::Fasta