Use awk para encontrar el promedio de una columna

Estoy intentando encontrar el promedio de la segunda columna de datos usando awk para una clase. Este es mi código actual, con el marco proporcionado por mi instructor:

 #!/bin/awk ### This script currently prints the total number of rows processed. ### You must edit this script to print the average of the 2nd column ### instead of the number of rows. # This block of code is executed for each line in the file { x=sum read name awk 'BEGIN{sum+=$2}' # The script should NOT print out a value for each line } # The END block is processed after the last line is read END { # NR is a variable equal to the number of rows in the file print "Average: " sum/ NR # Change this to print the Average instead of just the number of rows } 

y recibo un error que dice:

 awk: avg.awk:11: awk 'BEGIN{sum+=$2}' $name awk: avg.awk:11: ^ invalid char ''' in expression 

Creo que estoy cerca, pero realmente no tengo idea de dónde ir desde aquí. El código no debe ser increíblemente complejo ya que todo lo que hemos visto en clase ha sido bastante básico. Por favor hagamelo saber.

 awk '{ sum += $2; n++ } END { if (n > 0) print sum / n; }' 

Agregue los números en $2 (segunda columna) en sum (las variables se inicializan automáticamente a cero por awk ) e incremente el número de filas (que también podrían manejarse mediante la variable incorporada NR). Al final, si hubo al menos un valor leído, imprima el promedio.

 awk '{ sum += $2 } END { if (NR > 0) print sum / NR }' 

Si desea usar la notación shebang, puede escribir:

 #!/bin/awk { sum += $2 } END { if (NR > 0) print sum / NR } 

También puede controlar el formato del promedio con printf() y un formato adecuado ( "%13.6e\n" , por ejemplo).

También puede generalizar el código para promediar la columna Nth (con N=2 en esta muestra) usando:

 awk -v N=2 '{ sum += $N } END { if (NR > 0) print sum / NR }' 

Su error específico es con la línea 11:

 awk 'BEGIN{sum+=$2}' 

Esta es una línea donde se invoca awk y se especifica su bloque BEGIN , pero usted ya está dentro de un script awk, por lo que no necesita especificar awk . También desea ejecutar sum+=$2 en cada línea de entrada, por lo que no lo quiere dentro de un bloque BEGIN . Por lo tanto, la línea debería simplemente leer:

 sum+=$2 

Tampoco necesitas las líneas:

 x=sum read name 

el primero simplemente crea un sinónimo para sum nombre x y no estoy seguro de qué hace el segundo, pero ninguno es necesario.

Esto haría tu script awk:

 #!/bin/awk ### This script currently prints the total number of rows processed. ### You must edit this script to print the average of the 2nd column ### instead of the number of rows. # This block of code is executed for each line in the file { sum+=$2 # The script should NOT print out a value for each line } # The END block is processed after the last line is read END { # NR is a variable equal to the number of rows in the file print "Average: " sum/ NR # Change this to print the Average instead of just the number of rows } 

La respuesta de Jonathan Leffler le da al awk un revestimiento que representa el mismo código fijo, con la adición de verificar que haya al menos 1 línea de entrada (esto detiene cualquier división por error cero). Si

Prueba esto:

 ls -l | awk -F : '{sum+=$5} END {print "AVG=",sum/NR}' 

NR es una variable incorporada de AWK para contar el no. de registros

 awk 's+=$2{print s/NR}' table | tail -1 

Estoy usando tail -1 para imprimir la última línea que debería tener el número promedio …