Awk 计算传递闭包

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 上面是一个示例输入文件,原始文件是数百万行。

我有我的成对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 
我目前正在尝试使用群集对它们进行群集,而且,我没有成功地运行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