2010-06-24 14 views
1

J'ai entrée qui ressemble àSomme des lignes marquées perl/shellscript

5 X 
8 Y 
3 Z 
9 X 

Je veux sortie qui additionne les valeurs numériques pour chaque « tag »; par exemple.

14 X 
8 Y 
3 Z 

demandant s'il y a une nappe une doublure je peux utiliser (le long des lignes de celles pour additionner une liste de nombres entiers à l'aide de awk).

Répondre

7

Quelque chose comme ça devrait faire l'affaire:

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

ou utiliser l'auto-partage:

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

Il vous manque l'indicateur '-n' pour faire une boucle sur toutes les entrées. (Nice FGITW, BTW) :) – Ether

0

aussi lisse que je peux le faire:

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

il semble que vous rencontrez des problèmes avec votre clé de l'espace :) –

0

Essayé de rendre aussi peu obscur que possible :) Trie la sortie par 'tag'.

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

0

sortie dans un ordre aléatoire

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

triée par ordre alphabétique par tag

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

classés par valeur

perl -alne'$t{$F[1]}+=$F[0]}{print"$t{$_} $_"for sort{$t{$b}<=>$t{$a}}keys%t' 
0
gawk "{count[$2]+=$1}END{for(i in count)print count[i],i}" 1.t