2014-12-17 5 views
1

5 개의 탭 구분 열이있는 테이블이 있습니다. 테이블은 끝에 제공됩니다. 열 "Name1"에는 하나 또는 여러 개의 "Name2"가 있습니다. 각 "Name2"에는 "Length", "Score"및 "Target (s)"이 있습니다.
다음 기준에 따라 하나의 "Name2"및 해당 "Name1"만 선택해야합니다.특정 조건에 따라 테이블에서 행 선택

(1) "Name2"의 유형이 하나 뿐인 경우 "Name1", "Name2", "Length"및 "Score"를 인쇄하십시오.
(2) 두 개 이상의 "Name2"유형 (동일한 "Name1")이있는 경우 "Name2"의 대상을 비교하십시오. 목표 세트가 모든 "Name2"에서 동일하면 높은 "Score"를 가진 하나의 "Name2"를 인쇄하십시오. 점수가 같으면 가장 높은 길이의 "Name2"를 인쇄하십시오. "Score"와 "Length"가 같으면 "Name1", "Score"및 "Length"가있는 첫 번째 "Name2"를 인쇄하십시오.

해시의 모든 테이블 정보를 가져올 수있는 프로그램을 작성했지만 동일한 "Name1"의 다른 "Name2"의 대상을 비교하는 방법을 쓸 수는 없습니다. 누구든지 프로그램을 완료하는 데 도움을 주시면 감사하겠습니다. 고마워. 프로그램은

#!/usr/bin/perl 
use Data::Dumper; 


%data=(); 
@arraysiRNA=(); 
$i=0; 
$file1=$ARGV[0]; 
open(FP1, $file1); 
while($siRNA=<FP1>) 
{ 
    chomp($siRNA); 

    @aa=split(/\t/,$siRNA); 
    ($clone_id,$amplicon_id,$amplicon_length,$amplicon_evidence,$amplicon_target)=split /\t/,$siRNA; 

    if(exists $data{$clone_id}) 
    { 


     $data{$clone_id}{$amplicon_id}{amplicon_length}=$amplicon_length; 
     $data{$clone_id}{$amplicon_id}{amplicon_evidence}=$amplicon_evidence; 
     push(@{ $data{$clone_id}{$amplicon_id}{amplicon_target}}, $amplicon_target); 

    } 
    else 
    { 
    $data{$clone_id}{$amplicon_id}{amplicon_length}=$amplicon_length; 
    $data{$clone_id}{$amplicon_id}{amplicon_evidence}=$amplicon_evidence; 
    push(@{ $data{$clone_id}{$amplicon_id}{amplicon_target}}, $amplicon_target); 
    } 

    $i++; 
} 


#print Dumper(\%data); 


foreach $Name1 (keys %data) 
{ 
    foreach $Name2 (keys %{$data{$Name1}}) 
    { 
    $len=$data{$Name1}{$Name2}{amplicon_length}; 
    $evid=$data{$Name1}{$Name2}{amplicon_evidence}; 
    @[email protected]{$data{$Name1}{$Name2}{amplicon_target}}; 
     #select only unique targets 
    @uniqueTar = do { my %seen; grep { !$seen{$_}++ } @tar }; 
    print "$Name1\t$Name2\tamplicon_length= $len\n"; 
    print "amplicon_evidence= $evid\n"; 
    print "amplicon_target= @tar\n"; 
    print "amplicon_target uniq= @uniqueTar\n"; 

    } 
} 



close FP1; 

(A) 입력 파일

Name1 Name2 Length Score Target  
sjj2_2RSSE.1 sjj2_2RSSE.1#II_15269285_15270181 897 3 WBGene00007064 
sjj2_2RSSE.1 sjj2_2RSSE.1#II_15269295_15270191 897 4 WBGene00007064 
sjj2_AC3.1 sjj2_AC3.1#V_10368996_10369727 732 3 WBGene00005532 
sjj2_AC3.2 sjj2_AC3.2#V_10373256_10373988 733 3 WBGene00007070 
sjj2_AC3.2 sjj2_AC3.2#V_10373256_10373988 733 3 WBGene00007028 
sjj2_AC3.2 sjj2_AC3.2#V_10373256_10373988 733 3 WBGene00007019 
sjj2_AC3.2 sjj2_AC3.2#V_10373256_10376356 3101 2 WBGene00007070 
sjj2_AC3.2 sjj2_AC3.2#V_10373256_10376356 3101 2 WBGene00007028 
sjj2_AC3.2 sjj2_AC3.2#V_10373256_10376356 3101 2 WBGene00007019 
sjj2_AC3.6 sjj2_AC3.6#V_10393744_10394300 557 3 WBGene00000724 
sjj2_AH10.1 sjj2_AH10.1#V_14146901_14148094 1194 4 WBGene00007082 
sjj2_AH6.10 sjj2_AH6.10#II_9548665_9549674 1010 3 WBGene00003177 
sjj2_AH6.10 sjj2_AH6.10#II_9548675_9549684 1010 2 WBGene00003177 

(B) 예상 출력

Name1  Name2 Length Score 
sjj2_2RSSE.1 sjj2_2RSSE.1#II_15269295_15270191 897 4 
sjj2_AC3.1 sjj2_AC3.1#V_10368996_10369727  732 3 
sjj2_AC3.2 sjj2_AC3.2#V_10373256_10373988  733 3 
sjj2_AC3.6 sjj2_AC3.6#V_10393744_10394300  557 3 
sjj2_AH10.1 sjj2_AH10.1#V_14146901_14148094 1194 4 
sjj2_AH6.10 sjj2_AH6.10#II_9548665_9549674 1010 3 

Program.pl " ./Program.pl Inputfile.txt으로 흥분했다

+0

정말 '엄격한'과 'ẁarnings'을 사용해야합니다. –

답변

1

트릭은 얼마나 많은 키 또는 배열 요소를 신속하게 알 수 있는지입니다. re는 중첩 해시에 있습니다. 나는이 패턴을 자주 사용한다.

scalar @{ $hash{$key} }

scalar keys %{ $hash{$key} }

요소의 수를 반환합니다. 당신이 해시 키는 1 하위 키가 있는지 확인하려면 그래서 :

if (scalar keys %{ $hash{$key} } == 1) {

이 패턴을 사용하여, 당신은 지금 사례를 확인할 수 있습니다 당신은 정의했습니다.

은 두 사건을 정의 :

  1. 복제가 하나 개의 증폭

  2. 복제가 다수의 증폭은 모든 증폭은

이 경우 2의 경우에 다음을 추가 동일한 대상에게이 24 및 31 행 :

$data2{$clone_id}{'amplicons'}{$amplicon_target} = 1; 

이제 분석 할 또 다른 루프를 추가하십시오. (이것은 덤프 이후의 하단 루프를 대체합니다).

foreach my $clone (keys %data) { 

    # case 1, clone only has 1 amplicon 
    if (scalar keys %{$data{$clone}} == 1) { 


    } else { 

     # case 2, clone has >1 amplicon but all have same target 
     if (scalar keys %{$data2{$clone}{'amplicons'} == 1) { 

     } 

    } 
} 
+0

제안 해 주셔서 대단히 감사드립니다. 나는 당신의 제안이 조건 (1)과 잘 작동하고 있음을 발견했으며, 클론은 1 개의 amplicon을 가지고 있습니다. 조건 2에 관해서는, 클론은 여러 앰플 리콘을 가지며 모든 앰플 리콘은 동일한 표적을 갖는다.여러 amplicon에 의해 하나의 표적 (공통)이있을 때 프로그램은 잘 작동합니다. 대상이 둘 이상인 경우 프로그램이 작동하지 않습니다. 내 조건에서 amplicon 하나 또는 여러 개의 대상이있을 수 있습니다. 두 번째 조건에서 하나 이상의 목표를 제안하십시오. 감사합니다 – firoz

+0

push(@{ $data{$clone_id}{$amplicon_id}{amplicon_target}}, $amplicon_target); 대신 내 머리 꼭대기에서 $data{$clone_id}{$amplicon_id}{amplicon_target}{$amplicon_target} = $score을 수행하면 "정렬 값 % {$ data {$ clone_id} {$ amplicon_id} {amplicon_target}}"로 가장 큰 점수를 얻을 수 있습니다. – Todd

관련 문제