awk - 计算传递闭包

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

上面是一个示例输入文件,原始文件有几百万行。 我希望输出根据行之间的公共(public)元素对重叠的 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

最佳答案

我认为这不是真的,但无论如何:

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

关于awk - 计算传递闭包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14267069/

相关文章:

shell - 如何用每个只有 1 个空行替换许多中间空行

python - 正则表达式 - 计算短串联重复的最大数量

python - 是否可以在 Snakemake 中有一个可选的输出文件?

python - 如何比较 python 中两个 CSV 的列?

python - 如何使用 python 反向补充多序列 fasta 文件?

python - 读取fasta序列

python - 如何使用任何分类器对每个数据点由一组浮点值组成的数据进行分类?

linux - 如何在系统命令中使用 awk 脚本的 shell 变量?

awk 输出字段中文本的唯一计数

sed - 用awk交换两列