2

我的成对 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
4

2 回答 2

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
于 2013-01-10T22:21:39.073 回答
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 等)进行了测试,两者都有效。输出省略。

于 2013-01-10T22:37:15.373 回答