我不是很擅长这个,也许你可以帮助我? 通过将键和值作为数组推送,我已成功将表加载到哈希中。 (我意识到我的术语可能不正确,请随意纠正,你可以在下面的代码中看到我的意思)。 无论如何我打印输出就像我想要的那样。我的目标是以fasta格式为每个密钥创建一个单独的文件(见下文)。任何想法?
输入: 一张桌子:
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
我想要的输出:在单独的文件中(在单独的文件中每次访问它的值,下面的示例是针对其中一个文件)
>GXEIR0201C1TW2
YDKANAFLNHGNYLAYGLAATTLWVLGIPHGFAVMHGKT \ RRGALVFDVADLVKDALVLPWAFI >GXEIR0201C1TW2
NAFLNHGNYLAYGLAATTLWVLGIPHGF / AVMHGKTRRGALVFDVADLVKDALVLPWAF >GXEIR0201C1TW2
YDKANAFLNHGNYLAYGLAATTLWVLGIPHGFA * MHGKTRRGALVFDVADLVKDALVLPWAFI`
(以下加入相同;我在单独的文件中调用$ key中的$ key)
到目前为止我的脚本:#!/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\n@{$value{$key}}\n"; #print all values of each key
#open (OUT, ">".$infile.$key"\_primary.fasta");
}
这给了我一个很好的输出键和它的所有值,我想使用该键作为我的最后一行的新文件名,并在下面显示的输出中的文件内...
这是经过48小时的尝试,我真的很擅长这个,尝试阅读网上的东西,但我没有很好地遵循它。 提前致谢。
答案 0 :(得分:1)
如果您将数组放入字符串中,它将使用special variable $"
作为分隔符来加入值。所以你需要设置那个变量。
$" = "\n";
foreach $key (sort keys %value)
{
open my $OUT, ">", $infile.$key."_primary.fasta";
print $OUT "$key\n@{$value{$key}}\n";
close $OUT;
}
注意print()
的第一个arg是要打印到的文件句柄。
等效的解决方案是使用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;
}