2010-12-28 6 views
2

У меня в наборе данных будет много столбцов. Мне нужно сделать, чтобы суммировать определенный столбец в терминах другого. В качестве примера,Perl подсчитывает сумму одного столбца, агрегируя другим

ID  Volume 
A   20 
D   60 
B   10 
A   50 
K   30 
B   100 
D   80 

Так что я хочу агрегированный сумму всех различных идентификаторов (A, B, C ...) с точки зрения объемов и сортируются по этой сумме

Результат будет как

D   140 
B   110 
A   70 
K   30 

Как бы это сделать в perl?

ответ

3
#!/usr/bin/perl 

    use strict; 
    use warnings; 

    my %ids_and_sums; 

    while (<>) { 
    # The regex will only consider one single uppercase letter as 
    # an ID; in case your IDs may look different, you could prepend 
    # your 'ID Volume' line with a character which will never be part 
    # of an ID, and modify below regex to meet your needs 
    my ($id, $volume) = m/^([A-Z])\s+(\d+)/; 

    if ($id and $volume) { 
     $ids_and_sums{$id} += $volume; 
    } 
    } 

    foreach my $key (sort {$ids_and_sums{$b} <=> $ids_and_sums{$a}} keys %ids_and_sums) { 
    print "$key: $ids_and_sums{$key}\n"; 
    } 

Эта печать:

D: 140 
B: 110 
A: 70 
K: 30 

EDIT: Я изменил код таким образом, что сортировка будет в порядке убывания сумм.

+0

+1 для сортировки ключей –

2

Вы можете сделать это, как:

perl -lnae '$H{$F[0]} += $F[1];END { print $_." ".$H{$_} for(keys %H) }' 

проходя все это, но в первой строке входного файла в качестве стандартного ввода.

Ideone Link

Вы можете сделать Perl отбрасывать строку заголовка, как:

perl -lnae 'BEGIN{$i=1;}if($i){$i=0;next;}$H{$F[0]} += $F[1];END { print $_." ".$H{$_ } for(keys %H) }' file 

Ideone Link

+1

gimme те один вкладыш – javadba

1
$, = ' '; # set output field separator 
$\ = "\n"; # set output record separator 

while (<>) { 
    ($Fld1,$Fld2) = split(' ', $_, -1); 
    $map{$Fld1} += $Fld2; 
} 

foreach $i (keys %map) { 
    print $i, $map{$i}; 
} 

что-то вроде этого