从包含其他信息的大文本文件中查找并获取序列

时间:2014-03-15 09:11:19

标签: perl

我得到2个P3DB格式的文本文件(第一个叫做#34;网站"有蛋白质ID,第二个叫#34;蛋白质"它有相应蛋白质ID的序列)。我必须使用Perl脚本将这两个转换为单个PhosphoSitePlus文本文件。

我已经想出如何转换大部分信息。现在我必须在"蛋白质"中找到序列和生物体名称。文件。我有一个来自"网站的特定蛋白质ID号码(例如,2329)。文件。现在我必须在"蛋白质"中搜索这个数字。文件。我找到了这个数字,但是在它下面是很多不必要的数据,在某个地方是有机体名称后面的序列。我不确定如何获取序列,因为我不知道它何时开始或停止。

有一种模式,其中所有序列都以制表空间和" M"开头。但是,最后的残留物可以是任何东西。此外,有机体名称可能在序列之后(没有空格)或在序列之后的多个空格之后开始。

我希望能够保存与蛋白质ID相对应的完整序列,以便能够在给定位置(数字)内找到该序列中的单个残基。或者能够在不必先保存序列的情况下找到一个残基。

以下是我的想法。

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

my $filename = $ARGV[0];
my $filename2 = $ARGV[1];

open AFILE, "$filename"; #open file - sites file 
open BFILE, "$filename2"; #open second file - proteins file 
open NEWFILE, ">PhosphoSitePlus.txt"; #make a new file to save

my @chunks = ();
my @blines = <BFILE>;
my $sequence;
my $res;
my $organism;
my $PID;
my $ACC;
my $Psite;

print NEWFILE "Accession        Modified Residue        Site Group ID   Organism        Sequence";

while (defined(my $line = <AFILE>)) { #iterate through lines of the _sites file
    my @chunks = split ' ', $line; #split columns into an array
    next if ( $chunks[0] =~  /P3DB/ ); #skip the first line (the headers)
    $PID = $chunks[0]; #save the Protein ID
    $ACC = $chunks[1]; #save the Accession number
    $Psite = $chunks[3]; #save the site that is phosphorylated

    foreach (0 .. $#blines){ #iterate through p3db_proteins

        my @b = split ' ', $blines[$_]; #split columns of lines into array
        if ($b[0] =~/^$PID$/){  #if the first column is equal to the protein ID the sequence is under
            next if ($blines[$_] !~ /^\s+M\w{20,}$/);
            if ( $blines[$_] =~ /^\tM\w{20,}$/ ){ #the start of the sequence(tab and an M, followed by 20 or more characters?)
                #save this sequence, or find the residue that is at the position of $Psite
            }
        }
    }
}

以下是蛋白质文件中序列的一些实例(2329和2330是蛋白质ID,并且以M开头的是序列和生物体名称)。

2329    EMBL:AAM13013.1;EMBL:AAM65937.1;EMBL:AAP13391.1;EMBL:AEC10514.1;Ensembl Genomes:AT2G45140;TAIR:At2g45140;TAIR:AT2G45140.1;Ensembl Genomes:AT2G45140.1;TAIR:AT2G45140.1;PIR:H84886;IPI:IPI00531520.1;Refseq:NM_130077.2;Refseq:NP_182039.1;Swissport:Q9SHC8.1;UniParc:UPI00000A0803;Swissport:VAP12_ARATH    plant VAP homolog 12    MSNELLTIDPVDLQFPFELKKQISCSLYLGNKTDNYVAFKVKTTNPKKYCVRPNTGVVHPRSSSEVLVTMQAQKEAPADLQCKDKFLLQCVVASPGATPKDVTHEMFSKEAGHRVEETKLRVVYVAPPRPPSPVREGSEEGSSPRASVSDNGNASDFTAAPRFSADRVDAQDNSSEARALVTKLTEEKNSAVQLNNRLQQELDQLRRESKRSKSGGIPFMYVLLVGLIGLILGYIMKRT Arabidopsis thaliana    19376835;19253305;19245862;18463617;17651370;17317660;15308754
2330    EMBL:AEE76598.1;Ensembl Genomes:AT3G22180;TAIR:At3g22180;TAIR:AT3G22180.1;Ensembl Genomes:AT3G22180.1;TAIR:AT3G22180.1;EMBL:BAB03066.1;IPI:IPI00547221.2;Refseq:NM_113115.3;Refseq:NP_188857.1;Swissport:Q9LIE4.2;UniParc:UPI00001634CF;Swissport:ZDHC8_ARATH   DHHC-type zinc finger family protein    MVRKHGWQLPAHTLQVIAITVFCLLVVAFYAFFAPFVGGRIWEYVLIGVYSPVAILVFVLYVRCTAINPADPRIMSIFDTGVNGDGMVRGLSRNYDETGSQLQASPSVVSRSSTVAGNSSVKGSVEDAQRVESVSRRSCYNPLAVFCYVFVVEDCRKKEGPAEEQGNSEEALFCTLCNCEVRKFSKHCRSCDKCVDCFDHHCKWLNNCVGRKNYVTFVSLMSASLLWLIIEAAVGIAVIVRVFVNKQTMETEIVNRLGNSFSRAPLAAVVGLCTAVAIFACFPLGELLFFHMLLIKKGITTYEYVVAMRAMSEAPDGASVDEEIQNVLYSPTGSATTGFSGGSSLGLPYRGVWCTPPRVFDNQDEVIPHLDPCMVPSTVDPDAPGSEKGTKALKRPVKRNAWKLAKLDPNEAARAAARARASSSVLRPIDNRHLPDNDLSSIGTVSIISSVSTDANVAASKEIRNNDLRSSLSRNSFAPSQGSRDEYDTGSHGMSNLSSPSHVHESVTLAPLPQNPTIVGNRFTATSHHMHSTFDDKVLHRGNDADPLFLFAPATSHLRDVRKTSVVWDPEAGRYVSAPVTTTSEVRNRLLNPSSQTASTQNPRPILPAHDSSSGSSALRDPLPLHQAERRLTYTGDSIFYGGPLINIPTRDTPRSGRGLVRDVQDRLASTVHRDARIRRDSTSNQLPVFAPGGLGANSQTGSNIK  Arabidopsis thaliana    17317660

2 个答案:

答案 0 :(得分:1)

你正在使用与行首相匹配的^和与行尾相匹配的$,这意味着该行的唯一内容是你正在寻找的序列微米。

但如果您的数据如图所示,则情况并非如此。

此外,如果您的文件与您说的一样大,我建议不要将整个文件放入内存,并逐行进行。

在正则表达式下面应该做你想做的事。

#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my $id = 2329;
my @info;
while(my $line = <DATA>){
    if($line =~ /(2329|2330)/){
        push @info, $line =~ /\s+(M\w+)/;
    }
}

print Dumper @info;

__DATA__
2329    EMBL:AAM13013.1;EMBL:AAM65937.1;EMBL:AAP13391.1;EMBL:AEC10514.1;Ensembl Genomes:AT2G45140;TAIR:At2g45140;TAIR:AT2G45140.1;Ensembl Genomes:AT2G45140.1;TAIR:AT2G45140.1;PIR:H84886;IPI:IPI00531520.1;Refseq:NM_130077.2;Refseq:NP_182039.1;Swissport:Q9SHC8.1;UniParc:UPI00000A0803;Swissport:VAP12_ARATH    plant VAP homolog 12    MSNELLTIDPVDLQFPFELKKQISCSLYLGNKTDNYVAFKVKTTNPKKYCVRPNTGVVHPRSSSEVLVTMQAQKEAPADLQCKDKFLLQCVVASPGATPKDVTHEMFSKEAGHRVEETKLRVVYVAPPRPPSPVREGSEEGSSPRASVSDNGNASDFTAAPRFSADRVDAQDNSSEARALVTKLTEEKNSAVQLNNRLQQELDQLRRESKRSKSGGIPFMYVLLVGLIGLILGYIMKRT Arabidopsis thaliana    19376835;19253305;19245862;18463617;17651370;17317660;15308754
2330    EMBL:AEE76598.1;Ensembl Genomes:AT3G22180;TAIR:At3g22180;TAIR:AT3G22180.1;Ensembl Genomes:AT3G22180.1;TAIR:AT3G22180.1;EMBL:BAB03066.1;IPI:IPI00547221.2;Refseq:NM_113115.3;Refseq:NP_188857.1;Swissport:Q9LIE4.2;UniParc:UPI00001634CF;Swissport:ZDHC8_ARATH   DHHC-type zinc finger family protein    MVRKHGWQLPAHTLQVIAITVFCLLVVAFYAFFAPFVGGRIWEYVLIGVYSPVAILVFVLYVRCTAINPADPRIMSIFDTGVNGDGMVRGLSRNYDETGSQLQASPSVVSRSSTVAGNSSVKGSVEDAQRVESVSRRSCYNPLAVFCYVFVVEDCRKKEGPAEEQGNSEEALFCTLCNCEVRKFSKHCRSCDKCVDCFDHHCKWLNNCVGRKNYVTFVSLMSASLLWLIIEAAVGIAVIVRVFVNKQTMETEIVNRLGNSFSRAPLAAVVGLCTAVAIFACFPLGELLFFHMLLIKKGITTYEYVVAMRAMSEAPDGASVDEEIQNVLYSPTGSATTGFSGGSSLGLPYRGVWCTPPRVFDNQDEVIPHLDPCMVPSTVDPDAPGSEKGTKALKRPVKRNAWKLAKLDPNEAARAAARARASSSVLRPIDNRHLPDNDLSSIGTVSIISSVSTDANVAASKEIRNNDLRSSLSRNSFAPSQGSRDEYDTGSHGMSNLSSPSHVHESVTLAPLPQNPTIVGNRFTATSHHMHSTFDDKVLHRGNDADPLFLFAPATSHLRDVRKTSVVWDPEAGRYVSAPVTTTSEVRNRLLNPSSQTASTQNPRPILPAHDSSSGSSALRDPLPLHQAERRLTYTGDSIFYGGPLINIPTRDTPRSGRGLVRDVQDRLASTVHRDARIRRDSTSNQLPVFAPGGLGANSQTGSNIK  Arabidopsis thaliana    17317660

此外,在您的while(defined(my $line = <AFILE>))行上,perl已经知道您的意思,并且您不需要包含已定义的部分。如果它没有收到数据/或到达文件末尾,$ line将评估为false。

答案 1 :(得分:0)

好吧,我想我理解你想要的东西。

您显示的少量数据似乎表现得非常好,因为两行都有六个以制表符分隔的字段。 ID是第一个字段,序列是第四个字段。你还提到了有机体名称,我认为这是第五个领域,但你不清楚你是否对这个价值感兴趣。

既然你说你的数据集很大,为了获得任何类型的性能,你需要从蛋白质文件中构建 hash ,以蛋白质ID为关键,序列和生物体将名称命名为。

此后,您只需查找给定蛋白质ID的数据,而不是搜索文件。

这个简短的程序显示了一个例子

use strict;
use warnings;

my %proteins;

open my $proteins_fh, '<', 'proteins.pdb' or die $!;

while (<$proteins_fh>) {
  my @fields = split /\t/;
  my ($pid, $sequence) = @fields[0, 3];
  $proteins{$pid} = $sequence;
}

use Data::Dump;
dd \%proteins;

<强>输出

{
  2329 => [
            "MSNELLTIDPVDLQFPFELKKQISCSLYLGNKTDNYVAFKVKTTNPKKYCVRPNTGVVHPRSSSEVLVTMQAQKEAPADLQCKDKFLLQCVVASPGATPKDVTHEMFSKEAGHRVEETKLRVVYVAPPRPPSPVREGSEEGSSPRASVSDNGNASDFTAAPRFSADRVDAQDNSSEARALVTKLTEEKNSAVQLNNRLQQELDQLRRESKRSKSGGIPFMYVLLVGLIGLILGYIMKRT",
            "Arabidopsis thaliana",
          ],
  2330 => [
            "MVRKHGWQLPAHTLQVIAITVFCLLVVAFYAFFAPFVGGRIWEYVLIGVYSPVAILVFVLYVRCTAINPADPRIMSIFDTGVNGDGMVRGLSRNYDETGSQLQASPSVVSRSSTVAGNSSVKGSVEDAQRVESVSRRSCYNPLAVFCYVFVVEDCRKKEGPAEEQGNSEEALFCTLCNCEVRKFSKHCRSCDKCVDCFDHHCKWLNNCVGRKNYVTFVSLMSASLLWLIIEAAVGIAVIVRVFVNKQTMETEIVNRLGNSFSRAPLAAVVGLCTAVAIFACFPLGELLFFHMLLIKKGITTYEYVVAMRAMSEAPDGASVDEEIQNVLYSPTGSATTGFSGGSSLGLPYRGVWCTPPRVFDNQDEVIPHLDPCMVPSTVDPDAPGSEKGTKALKRPVKRNAWKLAKLDPNEAARAAARARASSSVLRPIDNRHLPDNDLSSIGTVSIISSVSTDANVAASKEIRNNDLRSSLSRNSFAPSQGSRDEYDTGSHGMSNLSSPSHVHESVTLAPLPQNPTIVGNRFTATSHHMHSTFDDKVLHRGNDADPLFLFAPATSHLRDVRKTSVVWDPEAGRYVSAPVTTTSEVRNRLLNPSSQTASTQNPRPILPAHDSSSGSSALRDPLPLHQAERRLTYTGDSIFYGGPLINIPTRDTPRSGRGLVRDVQDRLASTVHRDARIRRDSTSNQLPVFAPGGLGANSQTGSNIK",
            "Arabidopsis thaliana",
          ],
}

此后,您可以直接从哈希中查找序列和有机体名称,而无需搜索它。 sites文件的读取循环就是这样。

while (<$sites_fh>) {

  my @chunks = split /\t/;
  next if $chunks[0] =~ /P3DB/;

  my ($pid, $acc, $psite) = $chunks[0, 1, 3];

  my $sequence = $proteins{$pid}[0];
  my $name     = $proteins{$pid}[1];

  # Use $sequence and $name somehow

}

请注意,我已将您的标识符更改为小写。熟悉Perl的人会感谢你,如果你为包名称这样的全局变量留下大写字母。

我还将文件句柄AFILE更改为词汇$sites_fh,因此您需要将您的开放语句更改为

open my $sites_fh, '<', 'sites.pdb' or die $!;

我希望这会有所帮助。