2012-03-18 1 views
1

나는 이것에 능숙하지 않다, 아마 당신은 저를 도울 수 있는가? 키와 값을 배열로 푸시하여 테이블을 해시에 성공적으로로드했습니다. (내 용어가 틀릴 수도 있다는 것을 알고 있으며, 그것을 바로 잡으십시오. 아래 코드에서 의미하는 것을 볼 수 있습니다.) 어쨌든 내가 원하는 출력을 인쇄하는 데 문제가 있습니다. 내 목표는 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 

I 원하는 출력 : 별도 파일

(이것은 각 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; 
} 

첫 번째 arg는 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; 
} 

또한 항목 목록을 취할 수 있습니다. 이 경우 특수 변수 $,을 원하는 값으로 구분하여 목록 값의 구분 기호로 사용해야합니다. $,은 기본적으로 정의되지 않기 때문에 그렇지 않으면 목록의 값은 단지 어떤 분리기로 인쇄됩니다

$, = "\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을 수행 할 첫 번째 부분 조정 $ key \ n "; print $ OUT2 join "\ n> $ key \ n", @ {$ value {$ key}}; –

+0

음, 첫 단락이 잘못되었습니다. 너 해봤 니? '@foo = ("one", "two", "three")를 실행하면됩니다. print "test : @foo \ n"; "그리고 무엇이 출력되는지보십시오. 또는, 더 나은 방법으로, [perldoc perlvar]에서'$ "를 찾아보십시오. (http://perldoc.perl.org/perlvar.html) –

+0

수정 해 주셔서 감사합니다. – stevenl

관련 문제