
Hola, necesito obtener la suma de todas y cada una de las columnas de un archivo. Debo ser flexible con tantas columnas como haya en un archivo determinado.
actualmente uso:
awk '{for (i=1;i<=NF;i++) sum[i]+=$i;}; END{for (i in sum) print sum[i];}'
Sin embargo, esto sólo me da la suma de la primera columna, que obviamente podría repetir, pero preferiría algo más simple.
¿Alguna idea/respuesta?
Respuesta1
Élhacele dará la suma de cada columna, pero en una columna (siempre que los datos estén separados por espacios en blanco):
$ cat data.in
1 2
3 4
5 6
$ awk '{ for (i=1;i<=NF;i++) sum[i]+=$i } END { for (i in sum) print sum[i] }' data.in
12
9
Entonces es una cuestión deno generar una nueva línea entre cada suma.
$ awk '{ for (i=1;i<=NF;i++) sum[i]+=$i } END { for (i in sum) printf("%d ", sum[i]); printf("\n") }' data.in
12 9
La printf()
función toma una cadena de formato. Es %d
la cadena de formato para un número entero (úsela %f
para flotantes), y el siguiente espacio también se generará después del número entero. Luego terminamos generando una nueva línea explícita después del ciclo.
Otra forma de solucionarlo, utilizando la ORS
variable ("Output Record Separator"):
$ awk 'BEGIN { ORS=" " } { for (i=1;i<=NF;i++) sum[i]+=$i } END { for (i in sum) print sum[i]; printf("\n") }' data.in
12 9
Consulte también la perspicaz advertencia de Dave Thompson en los comentarios a continuación sobre el orden de las claves en las matrices asociativas de Awk (que no se garantiza que estén ordenadas).
Respuesta2
perl -lane '$sum[$_] += $F[$_] for 0..$#F; END {print join $", @sum}' data.in