标记行perl / shellscript的总和

时间:2010-06-24 21:00:43

标签: perl sum shell

我的输入看起来像

5 X
8 Y
3 Z
9 X

我想要输出对每个'标签'的数值求和; e.g。

14 X
8 Y
3 Z

想知道是否有一个光滑的衬垫我可以使用(沿着那些用于使用awk对整数列表求和的行)。

5 个答案:

答案 0 :(得分:7)

这样的事情可以解决问题:

perl -ne '$table{$2} += $1 if /(\d+)\s+(.+)/; END {print "$table{$_} $_\n" for keys %table}'

或使用自动分割:

perl -ane '$table{$F[1] or next} += $F[0]; END {print "$table{$_} $_\n" for keys %table}'

答案 1 :(得分:0)

像我一样光滑:

perl -alne 'END{print"$X{$_} $_"for sort{$X{$b}<=>$X{$a}}keys%X}$X{$F[1]}+=$F[0]'

答案 2 :(得分:0)

试图让它尽可能少混淆:) 按'标签'排序输出。

perl -alne '$counts{$F[1]} += $F[0]; END { print "$counts{$_} $_" for sort(keys %counts) }'

答案 3 :(得分:0)

以随机顺序输出

perl -alne'$t{$F[1]}+=$F[0]}{print"$t{$_} $_"for keys%t'

按标签按字母顺序排序

perl -alne'$t{$F[1]}+=$F[0]}{print"$t{$_} $_"for sort keys%t'

按值排序

perl -alne'$t{$F[1]}+=$F[0]}{print"$t{$_} $_"for sort{$t{$b}<=>$t{$a}}keys%t'

答案 4 :(得分:0)

gawk "{count[$2]+=$1}END{for(i  in count)print count[i],i}" 1.t