2010-02-22 19 views
13

Tengo un archivo de texto que es:¿Cómo puedo sumar valores en la columna en función del valor en otra columna?

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

quiero una salida que resume los valores individuales y los muestra como resultado. Por ejemplo, el total de todos los valores ABC en el archivo son (50 + 30 = 80) y DEF es (100 + 70 = 170). Por lo tanto, la salida debe resumir todos los nombres únicos de la primera columna como -

ABC 80 
DEF 170 
XYZ 20 
MNP 60 

Cualquier ayuda será muy apreciada.

Gracias

Respuesta

3

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

si no necesita los resultados ordenados alfabéticamente, simplemente dejar caer la parte | sort.

+0

perder el gato. Su UUOC. – ghostdog74

+0

@ ghostdog74: de hecho – ggiroux

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

¿por qué no dividir en espacios en blanco en lugar de regex? – ghostdog74

+0

De cualquier forma funcionaría. Mi enfoque es un poco más valioso, pero también un poco más complejo. –

10
$ awk '{a[$1]+=$2}END{for(i in a) print i,a[i]}' file 
ABC 80 
XYZ 20 
MNP 60 
DEF 170 
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
perl -lane '$_{$F[0]}+=$F[1]}print"$_ $_{$_}"for keys%_;{' file 

Y un poco menos sencillo:

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

3 caracteres menos: perl -anE '$ _ {$ F [0]} + = $ F [1]} diga "$ _ $ _ {$ _}" para las claves% _; {' archivo –

+0

Lo sé. Pero funciona solo en 5.010;) – codeholic

Cuestiones relacionadas