【问题标题】:Combining duplicated lines in txt file with perl将txt文件中的重复行与perl结合起来
【发布时间】:2012-08-30 09:45:04
【问题描述】:

我正在尝试使用 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

我想通过添加三个数字列来合并重复的行,因此包含“ATGCA”的行现在看起来像这样:

ATGCA  0.024 3 39

任何想法/帮助/建议将不胜感激!谢谢!

【问题讨论】:

标签: perl text-files


【解决方案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";
}

【讨论】:

  • 这可能并不重要,除非文件变得非常大,但值得指出的是,您不必要地创建了@v 的额外副本。我会用$hash{$v[0]} = \@v 替换$hash{$v[0]} = [@v] 以避免这种情况。但是你知道他们对过早优化的看法:-)
【解决方案2】:

这是另一个选择:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-18
    • 2013-12-27
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    • 2018-11-22
    • 2017-03-02
    • 1970-01-01
    相关资源
    最近更新 更多