计算传递闭包

时间:2013-01-10 20:52:33

标签: 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

以上是一个示例输入文件,原始文件是几百万行。 我希望输出基于行之间的公共元素聚集重叠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 

我目前正在尝试使用mclsilix对它们进行聚类,但我没有成功运行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

2 个答案:

答案 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等)进行了测试。输出省略。