我在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
总结那些讨厌的花车。
有什么想法吗?
我在OS X 10.8.5上的bash 3.2.48中运行awk
版本20070501。
正确推断出@sudo_O,问题出在我的语言环境中。用文件中的.
替换,
会产生正确的结果。这显然不是我正在寻找的解决方案,所以我需要对我目前设置的语言环境做一些事情:
$ 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
工作?
答案 0 :(得分:18)
这里的问题不是awk
。明确使用浮点数,看看你得到了什么:
$ awk '{sum+=sprintf("%f",$1)}END{printf "%.6f\n%.6f\n",sum,sum/NR}' file
4.534000
0.566750
看起来它可能是您的语言环境,因为您的输出使用,
作为小数分隔符,因此发布locale
命令的输出。
所以使用你的LC_NUMERIC
我可以重现你的结果:
$ LC_NUMERIC="de_CH.UTF-8" awk '{sum += $1} END {print sum; print sum / NR}' file
3
0,375
修复方法是将您的LC_NUMERIC
或LC_ALL
设置为C
或使用.
作为小数点分隔符的任何其他内容:
$ LC_NUMERIC="C" awk '{sum += $1} END {print sum; print sum / NR}' file
4.534
0.56675
有关详细信息,请参阅man locale
。