공통 값으로 행 병합

공통 값으로 행 병합

그룹에서 모든 일치 항목을 찾을 수 있도록 텍스트 파일에서 일치 항목 쌍을 결합하려고 합니다.

내 파일에는 다음과 같이 두 개의 탭으로 구분된 열이 포함되어 있습니다.

Simon John
Simon Paul
Steve Simon
Graham Dave
Dave Jason
Paul Simon
Peter Derek

출력 그룹이 있는 파일을 원합니다.

Simon John Paul Steve
Graham Dave Jason
Peter Derek

어떤 도움이라도 매우 도움이 될 것입니다! 아래 스크립트를 시도했지만 일치 항목이 중복되는 것 같고(예: Simon은 출력 파일의 다른 줄에 두 번 나타납니다) 실행하는 데 시간이 오래 걸립니다. 이상적으로는 bash에서 이를 수행할 수 있는 방법이 있다면 좋을 것입니다.

use strict;

my(@homologs,$genefile,@temp,$line,$found,$i,$j);

$genefile="Arabidopsis_combined.txt";

open(IN,"<$genefile") or die "cannot open $genefile\n";
$j=0;
while(!eof(IN)){
    $line=readline *IN;
    chomp($line);
    @temp=split /\t/,$line;
    $i=0;
    $found="F";
    while($i<@homologs){
        if($temp[0]~~@{$homologs[$i]}){
            if($temp[1]~~@{$homologs[$i]}){}
            else{push @{$homologs[$i]},$temp[1];}
            $found="T"; 
            }
        if($temp[1]~~@{$homologs[$i]}){
            if($temp[0]~~@{$homologs[$i]}){}
            else{push @{$homologs[$i]},$temp[0];}
            $found="T";         
            }
        $i++;       
        }
    if($found eq "F"){
        push @homologs,[@temp];
        }
    print $j."\n";
    $j++;
    }
close(IN);

print "Number of groups of homologs: ".@homologs."\n";

open(OUT,">homologs.txt");
$i=0;
while($i<@homologs){
    print OUT "@{$homologs[$i]}"."\n";
    $i++;   
    }
close(OUT);

답변1

이는 무방향 그래프에서 연결된 구성요소를 찾는 표준 문제입니다. 귀하의 질문에 다음 태그를 지정했으므로 perl:

#!/usr/bin/env perl

use v5.10;                                       
use strict;
use warnings;

use Graph::Undirected;

my $g = Graph::Undirected->new;

while (<>) {
    chomp;
    $g->add_edge( split /\t/ );
}

for ( $g->connected_components() ) {
    say join ' ', @$_;
}

또는 그에 상응하는 명령줄:

perl -MGraph::Undirected -F'\t' -lane '
  BEGIN{$g=Graph::Undirected->new}
  $g->add_edge(@F);
  END{$,=" ";print @$_ for $g->connected_components}'

관련 정보