Как суммировать значения в столбце на основе значения в другом столбце? - PullRequest
14 голосов
/ 22 февраля 2010

У меня есть текстовый файл:

ABC 50
DEF 70
XYZ 20
DEF 100
MNP 60
ABC 30

Я хочу вывод, который суммирует отдельные значения и показывает их в результате.Например, сумма всех значений ABC в файле равна (50 + 30 = 80), а DEF - (100 + 70 = 170).Таким образом, выходные данные должны суммировать все уникальные имена 1-го столбца как -

ABC 80
DEF 170
XYZ 20
MNP 60

Любая помощь будет принята с благодарностью.

Спасибо

Ответы [ 5 ]

14 голосов
/ 22 февраля 2010
$ awk '{a[$1]+=$2}END{for(i in a) print i,a[i]}' file
ABC 80
XYZ 20
MNP 60
DEF 170
5 голосов
/ 22 февраля 2010
$ perl -lane \
    '$sum{$F[0]} += $F[1];
     END { print "$_ $sum{$_}"
             for sort grep length, keys %sum }' \
    input
ABC 80
DEF 170
MNP 60
XYZ 20
3 голосов
/ 22 февраля 2010

awk '{sums[$1] += $2} END { for (i in sums) printf("%s %s\n", i, sums[i])}' input_file | sort

если вам не нужны результаты, отсортированные по алфавиту, просто отбросьте часть | sort.

2 голосов
/ 22 февраля 2010
perl -lane '$_{$F[0]}+=$F[1]}print"$_ $_{$_}"for keys%_;{' file

И чуть менее просто:

perl -ape '$_{$F[0]}+=$F[1]}map$\.="$_ $_{$_}\n",keys%_;{' file
1 голос
/ 22 февраля 2010
my %data;
while (<>) {
    if (my ($key, $value) = /^(\w+) \s* (\d+)$/x) {
        $data{$key} += $value;
    }
}
printf "%s %s\n", $_, $data{$_} for keys %data;
...