1

Perl を使用して重複行を結合しようとしていますが、運が悪いです。タブ区切りのテキスト ファイルは次のように構成されています (読みやすくするためにスペースが追加されています)。

Pentamer  Probability Observed Length
ATGCA    0.008        1        16
TGTAC    0.021        1        16
GGCAT    0.008        1        16
CAGTG    0.004        1        16
ATGCA    0.016        2        23
TGTAC    0.007        1        23

3 つの数値列を追加して重複した行を結合したいので、「ATGCA」を含む行は次のようになります。

ATGCA  0.024 3 39

アイデア/ヘルプ/提案は大歓迎です! ありがとう!

4

2 に答える 2

1
#!/usr/bin/perl

use warnings;
use strict;

my %hash;
while(<>) {
  my @v = split(/\s+/);
  if (defined $hash{$v[0]}) {
    my $arr = $hash{$v[0]};
    $hash{$v[0]} = [$v[0], $arr->[1] + $v[1], 
                   $arr->[2] + $v[2], $arr->[3] + $v[3]];
  } else {
    $hash{$v[0]} = [@v];
  }
}
foreach my $key (keys %hash) {
  print join(" ", @{$hash{$key}}), "\n";
}
于 2012-08-29T14:32:44.187 に答える
1

別のオプションは次のとおりです。

use Modern::Perl;

my %hash;

while ( my $line = <DATA> ) {
    my @vals = split /\s+/, $line;
    $hash{ $vals[0] }->[$_] += $vals[ $_ + 1 ] for 0 .. 2;
}

say join "\t", $_, @{ $hash{$_} } for sort keys %hash;

__DATA__
ATGCA   0.008   1   16
TGTAC   0.021   1   16
GGCAT   0.008   1   16
CAGTG   0.004   1   16
ATGCA   0.016   2   23
TGTAC   0.007   1   23

出力:

ATGCA   0.024   3   39
CAGTG   0.004   1   16
GGCAT   0.008   1   16
TGTAC   0.028   2   39
于 2012-08-30T01:45:04.807 に答える