2012-03-18 142 views
1

我不是在这个非常好,也许你能帮助我吗? 通过将键和值作为数组推送,我已经成功地将一个表加载到哈希中。 (我知道我的术语可能不正确,请随时纠正,你可以在我的代码中看到我的意思)。无论如何,我无法打印像我想要的输出。我的目标是以fasta格式为每个密钥创建一个单独的文件(请参见下文)。有任何想法吗?如何在Perl中打印散列(或其元素)?

输入: 一个表:

Rank Query Name E-Value Frame Description Accession (to NCBI) Bits Fraction Identical (%) Fraction Conserved (%) HSP Length Query Length Hit Length Coverage Query (%) Coverage Hit (%) Query Start Query End Hit Start Hit End Query String 
1 50085564 4e-16 0 rank=0087540 x=1133.0 y=3620.5 length=437 GXEIR0201C1TW2 76.1 60.3174603174603 77.7777777777778 63 149 437 42.2818791946309 14.41647597254 87 149 186 372 YDKANAFLNHGNYLAYGLAATTLWVLGIPHGFAVMHGKTRRGALVFDVADLVKDALVLPWAFI 
2 50085564 7e-16 0 rank=0408491 x=1798.0 y=287.0 length=296 GX6ON9A01EN42P 74.8 62.7118644067797 79.6610169491525 59 149 296 39.5973154362416 19.9324324324324 91 149 51 225 NGFLNHGNYLAYGLAATTLWVLGIPHGFAVMHGKTRRGALVFDVADLVKDALVLPWAFI 
3 50085564 2e-15 0 rank=0281898 x=768.0 y=1387.0 length=283 GX6ON9A01B5QL5 72.9 63.1578947368421 80.7017543859649 57 149 283 38.255033557047 20.1413427561837 93 149 51 219 FLNHGNYLAYGLAATTLWVLGIPHGFAVMHGKTRRGALVFDVADLVKDALVLPWAFI 
4 50085564 3e-15 0 rank=0714663 x=648.0 y=2458.0 length=264 GXEIR0201BU76K 72.3 59.6491228070175 80.7017543859649 57 149 264 38.255033557047 21.5909090909091 93 149 79 247 FLNHGNYLAYGLAATTLWVLGIPHGFAVMHGKTRRGALIFDVADLVKDALILPWAFI 
5 50085564 3e-14 0 rank=0643198 x=1035.0 y=163.0 length=398 GXEIR0201CS5IT 69.8 61.4035087719298 78.9473684210526 57 149 398 38.255033557047 14.321608040201 93 149 147 315 FLNHGNYLAYGLAATTLWVLGIPHGFAVMXGKTRRGALVFDVADLVKDALVLPWAFI 
6 50085564 4e-09 0 rank=0641162 x=178.0 y=3351.0 length=287 GXEIR0201APZFT 52.3 54.7619047619048 76.1904761904762 42 149 287 28.1879194630872 14.6341463414634 1 42 11 134 PIANTTVILLGNGTSITQAAVRMLAQAGVLIGFCGGGGTPLY 
7 50085564 4e-09 0 rank=0189408 x=1683.0 y=2055.0 length=418 GXEIR0201ED2ZD 52.8 45.3333333333333 68 75 149 418 50.3355704697987 17.9425837320574 1 75 64 340 PIANTTVILLGNGTSITQAAVRMLAQAGVLIGFCGGGGTPLYMGNAIEWLTPQSEYRPTEYLQGWLGFWFDDEQRLLTAKAMQHSRIDFLQKV 
8 50085564 5e-07 0 rank=0324549 x=1541.5 y=2792.5 length=281 GX6ON9A01D1MRE 45.2 75.8620689655172 89.6551724137931 29 149 281 19.4630872483221 10.3202846975089 121 149 197 281 MXGKTRRGALVFDVADLVKDALVLPWAFI 
9 50085564 6e-05 0 rank=0560234 x=126.0 y=2770.0 length=351 GXEIR0201ALEM8 38.7 42.6966292134831 59.5505617977528 89 149 351 59.7315436241611 25.3561253561254 30 124 57 345 LAGFDGDGLIPALDS---SRANID---RAMKTGDLLTSEAQLTKLLYKFAARSTT*KAL/YREHDATDKANGFLNHGNYLAYGLAATTLSG\LGIPHGFAVMHGK 

欲输出:在单独的文件(与它的每个accesion是在一个单独的文件中的值,下面的例子是用于这样的文件中的一个)

>GXEIR0201C1TW2 YDKANAFLNHGNYLAYGLAATTLWVLGIPHGFAVMHGKT \ RRGALVFDVADLVKDALVLPWAFI >GXEIR0201C1TW2 NAFLNHGNYLAYGLAATTLWVLGIPHGF/AVMHGKTRRGALVFDVADLVKDALVLPWAF >GXEIR0201C1TW2 YDKANAFLNHGNYLAYGLAATTLWVLGIPHGFA * MHGKTRRGALVFDVADLVKDALVLPWAFI`

(以下加入也一样;我叫我的脚本$关键在一个单独的文件)

我的剧本至今:

#!/usr/bin/perl -w 
my $infile=$ARGV[0] or die ("File not opening\n"); 
#### first file is a list of the reads ... you want to feed this list into a hash to pick only unique ones. 
open (LIST,$infile); 
my %value=(); #declare the hash 
my $rank; my $query; my $evalue; my $frame; my $description; my $key; my $bits; 
my$fr_ident; my $fr_cons; my $query_leng; my $hit_leng; my $query_cov; my $hit_cov; my $query_start; my $query_end; my $hit_start; my $hit_end; 
my $value;my $hsp_leng; 

while (<LIST>) 
{ 
    ($rank,$query,$evalue,$frame,$description,$key,$bits,$fr_ident,$hsp_leng,$fr_cons,$query_leng,$hit_leng,$query_cov,$hit_cov,$query_start,$query_end,$hit_start,$hit_end,$value) = split(/\t/); # split your input by a /t and enter each into a value// might not need all of these, but good for future ref 
    push (@{$value{$key}},$value);chomp (@{$value{$key}},$value); # make key and values for each entry 
} 

foreach $key (sort keys %value) 
{ 
    #print "KEY: $key , VALUE: $value , ELEMENT? \$value\{key\} : $value{$key}\n"; 
    print "$key\[email protected]{$value{$key}}\n"; #print all values of each key 
    #open (OUT, ">".$infile.$key"\_primary.fasta"); 
} 

这给了我钥匙的一个不错的输出,这一切的价值观,我想使用的密钥一个新的文件名,我的最后一行,并有东西在下面显示的输出文件中...

这是48小时后尝试,我在这个非常糟糕的,尝试阅读网上的东西,但我没有很好地遵守。 在此先感谢。

回答

1

如果将数组放入字符串中,它将使用special variable$"作为分隔符将值连接起来。所以你需要设置该变量。

$" = "\n"; 
foreach $key (sort keys %value) 
{ 
    open my $OUT, ">", $infile.$key."_primary.fasta"; 
    print $OUT "$key\[email protected]{$value{$key}}\n"; 
    close $OUT; 
} 

注意第一个参数为print()是打印到的文件句柄。

一个等效的解决方案是使用join()功能。

foreach $key (sort keys %value) 
{ 
    open my $OUT, ">", $infile.$key."_primary.fasta"; 
    print $OUT join "\n", $key, @{$value{$key}}; 
    print $OUT "\n"; 
    close $OUT; 
} 

print()也可以取项目列表。在这种情况下,您需要将特殊变量$,设置为您希望作为列表值分隔符的值。否则,在列表中的值将只印有没有分隔,因为$,默认情况下未定义:

$, = "\n"; 
foreach my $key (sort keys %value) 
{ 
    open my $OUT, ">", $infile.$key."_primary.fasta"; 
    print $OUT $key, @{$value{$key}}; 
    print $OUT "\n"; 
    close $OUT; 
} 
+0

太感谢了......我需要的,我调整了第一部分做打印$ OUT2“> $键\ n“; 打印$ OUT2加入 “\ n> $键\ n”,@ {$值$ {键}}; – 2012-03-18 13:48:22

+0

恩,你的第一段是错的。你试过了吗?只需运行@foo =(“one”,“two”,“three”);打印“测试:@foo \ n”;'看看它打印什么。或者,更好的是,查找'$“'在[参阅perldoc perlvar(http://perldoc.perl.org/perlvar.html)。 – 2012-03-18 16:00:23

+0

感谢你的更正 – stevenl 2012-03-19 01:23:32