2013-03-04 66 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