开发者

Sum of tagged lines perl/shellscript

开发者 https://www.devze.com 2023-01-04 21:07 出处:网络
I have input that looks like 5 X 8 Y 3 Z 9 X I want output that sums the numerical values for each \'tag\'; e.g.

I have input that looks like

5 X
8 Y
3 Z
9 X

I want output that sums the numerical values for each 'tag'; e.g.

14 X
8 Y
3 Z

Wondering if there is a slick one liner I can use (along the lines of the ones for summing a list of integers using aw开发者_StackOverflow中文版k).


Something like this should do the trick:

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

or to use auto-splitting:

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


As slick as I can make it:

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


Tried to make it as little obfuscated as possible :) Sorts output by 'tag'.

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


Output in random order

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

alphabetically sorted by tag

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

sorted by value

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


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

精彩评论

暂无评论...
验证码 换一张
取 消