我试图在文本文件中组合成对匹配,以便我可以找到组中的所有匹配:例如
我的文件包含两个制表符分隔的列,如下所示:
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}'