8

awk我想在哪里计算列的平均值时遇到了一个相当奇怪的问题。这是我的文件中的测试输入:

1
2
0.4
0.250
0.225
0.221
0.220
0.218

这是我要运行的脚本:

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

我期望的输出是:

<calculated sum>
<calculated average>

但这就是我总是得到的:

3
0,375

我检查了输入文件的格式和字符等,但我无法awk总结那些讨厌的浮点数。

有任何想法吗?

awk在 OS X 10.8.5 上的 bash 3.2.48 中运行版本 20070501。

更新

正如@sudo_O 正确推断的那样,问题是我的语言环境。.将文件中的a替换为,正确的结果。这显然不是我正在寻找的解决方案,所以我需要对我当前设置为的语言环境做一些事情:

$ 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=

我想保留我认为的数字、货币和日期语言环境。我需要更改(以及如何)哪个语言环境才能awk工作?

4

1 回答 1

26

问题不在awk这里。显式使用浮点数,看看你得到了什么:

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

看起来这可能是您的语言环境,因为您的输出使用 a,作为小数分隔符,因此请发布locale命令的输出。


因此,使用您的LC_NUMERICI 可以重现您的结果:

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

解决方法是将您的LC_NUMERIC或设置LC_ALLC或任何其他.用作小数分隔符的内容:

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

有关man locale更多信息,请参阅。

于 2013-09-22T17:41:33.130 回答