我的成对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
以上是一个示例输入文件,原始文件是几百万行。 我希望输出基于行之间的公共元素聚集重叠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
答案 0 :(得分:1)
我认为这不是真的,但无论如何:
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
答案 1 :(得分:1)
如你所愿,这里有awk解决方案:
awk 'BEGIN{f=1}{c=0;
for(i=1;i<=f;i++){
if(!a[i]){
a[i]=$1" "$2; c=1; break;
}else if(a[i]~$1){
a[i]=a[i]" "$2; c=1; break;
}else if(a[i]~$2){ a[i]=a[i]" "$1; c=1; break; }
}
if(!c){ a[++f]=$1" "$2; c=0; }
} END{for(x=1;x<=f;x++)print a[x]}' DnaFile
上面的代码使用更简单的输入文件和原始文件(使用CCGGTTAA等)进行了测试。输出省略。