La suma de cada columna de un archivo debe ser flexible para tantas columnas como haya en el archivo.

La suma de cada columna de un archivo debe ser flexible para tantas columnas como haya en el archivo.

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 %dla cadena de formato para un número entero (úsela %fpara 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 ORSvariable ("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

información relacionada