我得到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
答案 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 $!;
我希望这会有所帮助。