如何根据另一列中的值对列中的值求和?

时间:2010-02-22 13:49:47

标签: scripting text-processing

我有一个文本文件:

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

我想要一个输出,它总结各个值并将其显示为结果。例如,文件中所有ABC值的总和为(50 + 30 = 80),DEF为(100 + 70 = 170)。所以输出应该将所有唯一的第一列名称总结为 -

ABC 80
DEF 170
XYZ 20
MNP 60

非常感谢任何帮助。

由于

5 个答案:

答案 0 :(得分:14)

$ awk '{a[$1]+=$2}END{for(i in a) print i,a[i]}' file
ABC 80
XYZ 20
MNP 60
DEF 170

答案 1 :(得分:5)

$ 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

答案 2 :(得分:3)

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

如果您不需要按字母顺序排序结果,只需删除| sort部分。

答案 3 :(得分:2)

perl -lane '$_{$F[0]}+=$F[1]}print"$_ $_{$_}"for keys%_;{' file

稍微简单一点:

perl -ape '$_{$F[0]}+=$F[1]}map$\.="$_ $_{$_}\n",keys%_;{' file

答案 4 :(得分:1)

my %data;
while (<>) {
    if (my ($key, $value) = /^(\w+) \s* (\d+)$/x) {
        $data{$key} += $value;
    }
}
printf "%s %s\n", $_, $data{$_} for keys %data;