我是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
答案 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"
;
}