Awk 计算传递闭包
我有我的成对DNA序列的数据,它们以如下方式显示相似性Awk 计算传递闭包,awk,bioinformatics,dna-sequence,transitive-closure,Awk,Bioinformatics,Dna Sequence,Transitive Closure,我有我的成对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 上面是一个示例输入文件,原始文件是数百万行。
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
我目前正在尝试使用群集对它们进行群集,而且,我没有成功地运行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
如您所愿,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
awk'BEGIN{f=1}{c=0;
对于(i=1;i每个序列的共同点是什么?每个序列都显示出与其他序列的一些相似性,这就是它们的分组方式,最后我想知道哪一组/簇序列构成一个组,我感兴趣的是基于成对匹配对它们进行分组。需要主要帮助才能将它们分组为一行,每一行代表一个簇请尝试解释一下你所说的相似性/分组/共同性是什么意思?不清楚,我也不知道它的结构,第一行开始是AAT..
,但第五行开始是GGC..
为什么?我已经修改了我的问题,看到最后,它有意义吗ows和列:|
谢谢,似乎正在工作。我将更改您的脚本以读取输入文件,看看它是否工作,如果您将CAGGCA | 12 GAGGCA | 1
附加到输入中,这将不起作用,即每行至少应有一个唯一的元素。但我将很快更新它。在我的输入中始终有一个唯一的元素,因此以上可能就足够了
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