Resultado

Resultado

Tengo un archivo como este:

paper 3
paper 6
eraser 2
pencil 9
pencil 44
pencil 1

Me gustaría resumir las líneas con un primer campo común, como este:

paper 9
eraser 2
pencil 54

¿Existe una linda línea para hacer esto usando utilidades estándar de Unix? O incluso utilidades Unix no tan estándar.

Respuesta1

Echa un vistazo a esto:

$ echo "$a"
paper 3
paper 6
eraser 2
pencil 9
pencil 44
pencil 1

$ awk '{a[$1]=a[$1]+$2}END{for (i in a) print i,a[i]}' <(echo "$a")
pencil 54
eraser 2
paper 9

Reemplace <(echo "$a)con su file:

$ awk '{a[$1]=a[$1]+$2}END{for (i in a) print i,a[i]}' file

Respuesta2

Con la utilidad no tan estándarMezcla de datos GNU

$ datamash --whitespace groupby 1 sum 2 < file
paper   9
eraser  2
pencil  54

o más sucintamente

$ datamash -Wg 1 sum 2 < file
paper   9
eraser  2
pencil  54

Respuesta3

Si nos importa el orden de impresión, podemos hacer esto:

perl -lane '$h{$F[0]}+=$F[1]; $h[-1+keys%h]=$F[0]; END{print "$_ $h{$_}" for @h}'

La idea es mantener las sumas acumuladas de un elemento particular en el hash %hy el orden en que se vio el elemento particular en la @hmatriz. Al final del archivo, simplemente imprimimos el hash (clave+valor) pero tomando el orden de @hla matriz.

Resultado

paper 9
eraser 2
pencil 54

Respuesta4

Aquí hay una frase no tan linda en awk:

awk '{ if (prev && prev != $1) { print prev, sum; sum = 0 }; sum += $2; prev = $1 } END { print prev, sum }' < file.txt

Requiere que las líneas con el mismo valor en el primer campo se agrupen. Si este no es el caso, puedes hacerlo sort file.txt | awk ....

información relacionada