2

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

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

我怎样才能得到像这样的输出

column_1_val, number_occurrence_column_1, sum_of_column_2,sum_of_column_3

例如

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

4 回答 4

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
于 2012-04-06T08:03:32.363 回答
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";
}

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

于 2012-04-06T07:01:54.857 回答
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"
       ;
}
于 2012-04-06T16:38:18.763 回答
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
于 2012-04-06T07:04:36.563 回答