我正面临着一个相当奇怪的问题,我想要计算一列的平均值.这是我的文件的测试输入:
- 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
我已经检查了输入文件的格式和字符等,但我无法总结那些讨厌的花车.
有任何想法吗?
我在OS X 10.8.5上的bash 3.2.48中运行awk版本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工作?
问题不在这里.明确使用浮点数,看看你得到了什么:
- $awk '{sum+=sprintf("%f",$1)}END{printf "%.6f\n%.6f\n",sum,sum/NR}' file
- 4.534000
- 0.566750
看起来它可能是您的语言环境,因为您的输出使用a作为小数分隔符,因此发布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.