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

Scripting 如何根据另一列中的值对列中的值求和?,scripting,text-processing,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 任何帮助都将不胜感激 感谢awk'{sums[$1]+=$2}END{for(i in sums)printf(“%s%s\n”,i,sums[i])}输

我有一个文本文件,它是:

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
任何帮助都将不胜感激


感谢

awk'{sums[$1]+=$2}END{for(i in sums)printf(“%s%s\n”,i,sums[i])}输入文件|排序

如果不需要按字母顺序对结果进行排序,只需删除排序部分。

my%数据;
my %data;
while (<>) {
    if (my ($key, $value) = /^(\w+) \s* (\d+)$/x) {
        $data{$key} += $value;
    }
}
printf "%s %s\n", $_, $data{$_} for keys %data;
而(){ 如果(我的($key,$value)=/^(\w+)\s*(\d+)$/x){ $data{$key}+=$value; } } printf“%s%s\n”,键%data的$\u$data{$\u};
$perl-lane\ “$sum{$F[0]}+=$F[1]; 结束{打印“$\$sum{$\}” 对于排序grep长度,键%sum}'\ 输入 ABC 80 DEF 170 MNP60 XYZ 20 还有一点不那么直截了当:

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

为什么不在空白处而不是正则表达式上拆分呢?两种方法都可以。我的方法更有效一些,但也更复杂一些。短3个字符:perl-anE'${$F[0]}+=$F[1]}对键%.\u${$};{文件 $ 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
perl -lane '$_{$F[0]}+=$F[1]}print"$_ $_{$_}"for keys%_;{' file
perl -ape '$_{$F[0]}+=$F[1]}map$\.="$_ $_{$_}\n",keys%_;{' file