如何使用Perl组织这些数据?

时间:2012-04-06 06:50:43

标签: perl

我是Perl的新手。我有一个输入文件,如:

a 7 5
b 8 2    
a 3 2   
b 4 1    
c 6 1

如何获得

之类的输出

column_1_valnumber_occurrence_column_1sum_of_column_2sum_of_column_3

例如

a 2 10 7
b 2 12 3
c 1 6 1

4 个答案:

答案 0 :(得分:2)

以下程序是一种可能的解决方案。我使用了DATA文件句柄,但您可能需要打开一个外部文件并使用该句柄。

use strict;
use warnings;

use feature 'say';

my %data;

while (<DATA>) {
  my ($key, @vals) = split;
  $data{$key}[0]++;
  my $i;
  $data{$key}[++$i] += $_ for @vals;
}

say join ' ', $_, @{$data{$_}} for sort keys %data;

__DATA__
a 7 5
b 8 2    
a 3 2   
b 4 1    
c 6 1

<强>输出

a 2 10 7
b 2 12 3
c 1 6 1

答案 1 :(得分:1)

这就像(未经测试):

while (<>) {
    if (m/(\w+)\s+(\d+)\s+(\d+)/) {
        ($n, $r1, $r2) = ($1, $2, $3);

        $nr{$n}++;
        $r1{$n} += $r1;
        $r2{$n} += $r2;
    }
}

for $n (sort keys %nr) {

    print "$n $nr{$n} $r1{$n} $r2{$n}\n";
}

这是一种非常快速和肮脏的方式来做你所描述的,但它应该让你在路上。

答案 2 :(得分:0)

即使我不知道perl。但是如果你关心结果。下面是awk中的解决方案。它可能/可能没有帮助你。但是如果你需要它:

awk '{c[$1]++;a[$1]=a[$1]+$2;b[$1]+=$3}END{for(i in a)print i,c[i],a[i],b[i]}' file3

答案 3 :(得分:0)

略有不同:

我的%记录;

while ( <> ) {
    my @cols = split ' ';
    my $rec  = $records{ $cols[0] } ||= {};
    $rec->{number_occurrence_column_1}++;
    $rec->{sum_of_column_2} += $cols[1];
    $rec->{sum_of_column_3} += $cols[2];
}

foreach my $rec ( map { { col1 => $_, %{ $records{ $_ } } } 
          sort keys %records 
        ) { 
    print join( "\t"
              , @$rec{ qw<col1 number_occurrence_column_1 
                          sum_of_column_2 sum_of_column_3
                         > 
                     } 
              ), "\n"
       ;
}