Как я могу суммировать значения в столбце на основе значения в другом столбце?

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

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

Любая справка будет значительно цениться.

Спасибо

14
задан skaffman 23 February 2010 в 22:16
поделиться

5 ответов

$ awk '{a[$1]+=$2}END{for(i in a) print i,a[i]}' file
ABC 80
XYZ 20
MNP 60
DEF 170
14
ответ дан 1 December 2019 в 11:59
поделиться
$ 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
5
ответ дан 1 December 2019 в 11:59
поделиться

awk '{суммы [$ 1] + = $ 2} END {для (i в суммах) printf ("% s% s \ n", i, sums [i])} 'input_file | sort

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

3
ответ дан 1 December 2019 в 11:59
поделиться
perl -lane '$_{$F[0]}+=$F[1]}print"$_ $_{$_}"for keys%_;{' file

И немного менее прямолинейно:

perl -ape '$_{$F[0]}+=$F[1]}map$\.="$_ $_{$_}\n",keys%_;{' file
2
ответ дан 1 December 2019 в 11:59
поделиться
my %data;
while (<>) {
    if (my ($key, $value) = /^(\w+) \s* (\d+)$/x) {
        $data{$key} += $value;
    }
}
printf "%s %s\n", $_, $data{$_} for keys %data;
1
ответ дан 1 December 2019 в 11:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: