AWK cómo contar la suma

AWK cómo contar la suma

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:

  1. En realidad, no se utiliza awkcomo se suele hacer. Recorre explícitamente las líneas del archivo en un BEGINbloque. Esta no es la forma idiomática en la que uno suele escribir awkprogramas, que consiste en proporcionar patrones o condiciones (opcionales) para que los bloques se ejecuten para cada registro de entrada (línea).
  2. 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 3a sum, pero primero tendrías que dividirlo en 20y 3.

Con GNU awko 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 awkel 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'

información relacionada