
archivo de entrada (FileInput.txt):
10 20 3 100 5 3 27
este es mi script awk:
BEGIN{ while((getline line < "FileInput.txt") > 0) {
}
¿Cómo puedo contar la suma? Lo intenté sum+=line
, pero resume solo la primera columna.
Respuesta1
Algo como puede hacer el trabajo:
awk 'BEGIN {sum=0} {for (i = 1; i <= NF; i++) sum+=$i} END {print sum}' FileInput.txt
Respuesta2
El problema con su código es doble:
- En realidad, no se utiliza
awk
como se suele hacer. Recorre explícitamente las líneas del archivo en unBEGIN
bloque. Esta no es la forma idiomática en la que uno suele escribirawk
programas, que consiste en proporcionar patrones o condiciones (opcionales) para que los bloques se ejecuten para cada registro de entrada (línea). - Dado que la entrada consta de registros (por defecto, líneas individuales) con más de un número, tendría que tratar estos registros de tal manera que los números individuales se sumen. En otras palabras, no puedes agregar
20 3
asum
, pero primero tendrías que dividirlo en20
y3
.
Con GNU awk
o mawk
, podemos establecer el separador de registros, RS
, en una expresión regular que coincida con cualquier secuencia de caracteres de espacio en blanco en lugar de la nueva línea predeterminada. Esto hace que awk
el archivo se lea como una colección de registros de campos únicos separados por espacios en blanco. Sumarlos e imprimir la suma al final es entonces trivial:
$ awk -v RS='[[:space:]]+' '{ sum += $1 } END { print sum }' FileInput.txt
168
Alternativamente,
$ awk 'BEGIN { RS = "[[:space:]]+" } { sum += $1 } END { print sum }' FileInput.txt
168
O puedes hacer alguna variantelo que muestra Romeo Ninov, que consiste en recorrer los campos de cada línea,
$ awk '{ for (i = 1; i <= NF; ++i) sum += $i } END { print sum }' file
168
Respuesta3
Podrías transformar tu archivo para que tengas un número por línea:
tr -s '[:blank:]' '\n' < FileInput.txt
Luego elija una solución dehttps://stackoverflow.com/q/2702564/7552para resumirlos. Por ejemplo
tr -s '[:blank:]' '\n' < FileInput.txt | perl -nle '$sum += $_ } END { print $sum'