Me estoy enfrentando un problema bastante extraño conawk donde yo se desea calcular el promedio de una columna. Esta es la prueba de formulario de entrada de mi archivo:

1
2
0.4
0.250
0.225
0.221
0.220
0.218

Y este es el script que estoy tratando de ejecutar:

awk '{sum += $1} END {print sum; print sum /NR}' ~/Desktop/bar.txt

Lo que se espera como resultado es:

<calculated sum>
<calculated average>

Pero esto es lo que me pasa invariablemente:

3
0,375

He comprobado el formato y los caracteres de la entrada de archivo, etc. pero yo no puedo irawk para resumir esos molestos flota.

Alguna idea?

Estoy corriendo awk versión 20070501 en bash 3.2.48 en OS X 10.8.5.

Actualización

Como @sudo_O correctamente deducida, el problema es que mi configuración regional. Sustitución de la . con un , en el archivo de los rendimientos de los resultados correctos. Que obviamente no es la solución que estoy buscando, así que necesito hacer algo con mi configuración regional que está configurado actualmente para:

$ locale
LANG="de_CH.UTF-8"
LC_COLLATE="de_CH.UTF-8"
LC_CTYPE="de_CH.UTF-8"
LC_MESSAGES="de_CH.UTF-8"
LC_MONETARY="de_CH.UTF-8"
LC_NUMERIC="de_CH.UTF-8"
LC_TIME="de_CH.UTF-8"
LC_ALL=

Me gustaría seguir numérico, monetaria y la fecha locales, creo. La configuración regional que necesito para cambiar (y cómo), para hacer awk trabajo?

InformationsquelleAutor Max Leske | 2013-09-22

1 Comentario

  1. 18

    El problema no es awk aquí. Explícitamente el uso de flotadores y ver lo que se obtiene:

    $ awk '{sum+=sprintf("%f",$1)}END{printf "%.6f\n%.6f\n",sum,sum/NR}' file
    4.534000
    0.566750

    Parece que es probablemente su localización como su salida utiliza un , como el separador de decimales de manera posterior a la salida de la locale comando.


    Así que utilizar su LC_NUMERIC puedo reproducir sus resultados:

    $ LC_NUMERIC="de_CH.UTF-8" awk '{sum += $1} END {print sum; print sum /NR}' file
    3
    0,375

    La revisión es establecer su LC_NUMERIC o LC_ALL a C o cualquier otra cosa que utilizar . como separador decimal:

    $ LC_NUMERIC="C" awk '{sum += $1} END {print sum; print sum /NR}' file
    4.534
    0.56675

    Ver man locale para obtener más información.

    • Esta es una muy útil la respuesta, porque no es enteramente obvio que awk falla para producir números de punto flotante debido a la LC_NUMERIC variable. Es bueno reconocer cómo afecta a la configuración regional de awk.

Dejar respuesta

Please enter your comment!
Please enter your name here