我的成对 DNA 序列数据通过以下方式显示出相似性..
AATGCTA|1 AATCGTA|2
AATCGTA|2 AATGGTA|3
AATGGTA|3 AATGGTT|8
TTTGGTA|4 ATTGGTA|5
ATTGGTA|5 CCTGGTA|9
CCCGGTA|6 GCCGGTA|7
GGCGGTA|10 AATCGTA|2
GGCGGTA|10 TGCGGTA|11
CAGGCA|12 GAGGCA|13
上面是一个示例输入文件,原始文件有几百万行。 我希望输出根据行之间的公共(public)元素对重叠的 id 进行聚类,并将它们输出到每个聚类的一行,如下所示
AATGCTA|1 AATCGTA|2 AATGGTA|3 AATGGTT|8 GGCGGTA|10 TGCGGTA|11
TTTGGTA|4 ATTGGTA|5 CCTGGTA|9
CCCGGTA|6 GCCGGTA|7
CAGGCA|12 GAGGCA|13
我目前正在尝试使用mcl对它们进行聚类还有silix ,我运行 silix 没有成功。但 mcl 目前正在进行中,我想知道是否有其他聪明的方法可以在 awk 或 perl 中做到这一点。我很欣赏一些解决方案,谢谢。 (这是我的第一篇文章,如果我犯了一些错误,我很抱歉)
只是为了让事情变得更简单.. 很容易说我的输入是,
1 2
2 3
3 8
4 5
5 9
6 7
10 2
10 11
12 13
我希望输出是,
1 2 3 8 10 11
4 5 9
6 7
12 13
最佳答案
我认为这不是真的,但无论如何:
use strict;
use warnings;
my @rows;
my %indx;
while(<DATA>) {
chomp;
my @v = split (/\s+/);
my $r = {};
for my $k (@v) {
$r = $indx{$k}[0] if defined $indx{$k};
}
$r->{$v[0]}++;
$r->{$v[1]}++;
# print join(",", @v), "\n";
push(@{$indx{$v[0]}}, $r);
push(@{$indx{$v[1]}}, $r);
push(@rows, $r);
}
my %seen;
for my $r (@rows) {
print (join("\t", keys %$r), "\n") if not $seen{$r}++;
}
__DATA__
AATGCTA|1 AATCGTA|2
AATCGTA|2 AATGGTA|3
AATGGTA|3 AATGGTT|8
TTTGGTA|4 ATTGGTA|5
ATTGGTA|5 CCTGGTA|9
CCCGGTA|6 GCCGGTA|7
GGCGGTA|10 AATCGTA|2
GGCGGTA|10 TGCGGTA|11
CAGGCA|12 GAGGCA|13
输出:
GGCGGTA|10 AATGCTA|1 AATGGTT|8 AATCGTA|2 AATGGTA|3 TGCGGTA|11
CCTGGTA|9 TTTGGTA|4 ATTGGTA|5
CCCGGTA|6 GCCGGTA|7
CAGGCA|12 GAGGCA|13
关于awk - 计算传递闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14267069/