Agregue una lista de valores de las columnas A y B separados por espacio y muestre el resultado de la suma [duplicado]

Dec 29 2020

Tengo un archivo llamado fold.txt. Tiene dos valores en cada línea separados por un espacio. Si digo que el primer valor representa la columna A y el segundo valor después del espacio es la columna B, ¿cómo puedo agregar todos los valores de la columna A y todos los valores de la columna B y mostrar la suma de cada columna individualmente?

Estoy esperando algo como esto:

$ cat fold.txt
100 500
200 300
700 100

Salida:

Total count Column A = 1000
Total count column B = 900

Respuestas

5 αғsнιη Dec 29 2020 at 00:00

Con awk:

awk '{ sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
     print "Total count column B = " sum_B +0;
}' infile

en el lenguaje awk , que es una herramienta para fines de procesamiento de texto, $1representa el valor de la primera columna, $2representa el valor de la segunda columna, $3para la tercera y así sucesivamente y uno especial NFrepresenta el ID de la última columna y, en consecuencia, $NFes el valor de la última columna (para que pueda reemplazar $2arriba con $NFtambién; y sí, lo capta cuando NFes la última ID de columna, por lo que el valor de la variable le dice cuántas columnas tiene (su actualización de valor para cada línea awk se lee desde la entrada)).

Para manejar el caso límite donde el archivo de entrada está vacío y aún obtiene una salida numérica, agregamos 0 al resultado, lo awkque obliga a generar un resultado numérico.

las columnas (o campos) se awkdistinguen por la FSvariable ( F eild S eparator) que por defecto es use Space / Tabs. si desea que las columnas se dividan en un carácter diferente, puede redefinirlas con la -Fopción de awkcomo en:

awk -F'<character-here>' '...' infile

o dentro del BEGIN{...}bloque como con FS:

awk 'BEGIN{ FS="<character-here>"; }; { ... }' infile

por ejemplo, para un archivo de entrada como el siguiente (ahora es una coma en lugar de un espacio):

100,500
200,300
700,100

puede escribir su awkcódigo de la siguiente manera:

awk -F',' '{ sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
     print "Total count column B = " sum_B +0;
}' infile

O dentro del BEGINbloque:

awk 'BEGIN{ FS=","; }; { sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
     print "Total count column B = " sum_B +0;
}' infile

Se vuelve un poco complejo y suma todas las N columnas de su archivo de entrada en la siguiente muestra:

100,500,140,400
200,300,640,200
700,100,400,130

Así que hablamos NFen el primer párrafo (el valor NF le dice cuántas columnas tiene (actualizar por cada línea)):

awk -F',' '{ for (i=1; i<=NF; i++) sum[i]+=$i; };
END{ for (colId in sum) { 
         printf ("Total count Column: %d= %d\n", colId, sum[colId] );
     };
}' infile

lo único nuevo aquí es que usamos una awkmatriz para abordar la misma columna Id tomando del valor de iy agregar sus valores $ia esa matriz (el índice / claves de esta matriz son los ID de columna); luego, en el END{...}bloque, recorremos nuestra matriz en las teclas que se ven, luego imprimimos la ID de la columna primero y luego la suma de las que están al lado, verá la salida como se muestra a continuación:

Total count Column: 1= 1000
Total count Column: 2= 900
Total count Column: 3= 1180
Total count Column: 4= 730
ctac_ Dec 30 2020 at 01:56

Es un buen trabajo para DC.

dc lee primero los datos de fold.txt y después el código de sum_col_dc.

Úselo así: dc fold.txt sum_col_dc

cat sum_col_dc  

[lB+sBlA+sAz0<C]sC[lGLElDnnnp]sH[Total count Column ]sD[B]sE[A]SE[ = ]sGlCxlAlHxlBlHx  

Con un poco más de detalles:

[lB+sBlA+sAz0<C]sC  
[lGLElDnnnp]sH  
[Total count Column ]sD  
[B]sE  
[A]SE  
[ = ]sG  
lCx  
lA  
lHx  
lB  
lHx  

Enjoy dc
Más explica bajo demanda.