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 をクラスター化し、クラスターごとに 1 行に出力するようにします。

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 に答える