合并具有共同值的行

合并具有共同值的行

我试图在文本文件中组合成对匹配,以便我可以找到组中的所有匹配:例如

我的文件包含两个制表符分隔的列,如下所示:

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

我想要一个输出组的文件,例如

Simon John Paul Steve
Graham Dave Jason
Peter Derek

任何帮助都会非常有用!我已经尝试了下面的脚本,但我似乎得到了重复的匹配项(例如,西蒙会在输出文件中的不同行上出现两次),并且需要很长时间才能运行。理想情况下,如果有办法在 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}'

相关内容