Max*_*ske 7 floating-point bash awk
我正面临一个相当奇怪的问题awk,我想要计算列的平均值.这是我的文件的测试输入:
1
2
0.4
0.250
0.225
0.221
0.220
0.218
Run Code Online (Sandbox Code Playgroud)
这是我正在尝试运行的脚本:
awk '{sum += $1} END {print sum; print sum / NR}' ~/Desktop/bar.txt
Run Code Online (Sandbox Code Playgroud)
我期望的输出是:
<calculated sum>
<calculated average>
Run Code Online (Sandbox Code Playgroud)
但这是我总是得到的:
3
0,375
Run Code Online (Sandbox Code Playgroud)
我已经检查了输入文件的格式和字符等,但我无法awk总结那些讨厌的花车.
有任何想法吗?
我awk在OS X 10.8.5上运行bash 3.2.48版本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=
Run Code Online (Sandbox Code Playgroud)
我想保留数字,货币和日期语言环境.我需要改变(以及如何)awk工作的区域设置?
Chr*_*our 18
问题不在awk这里.明确使用浮点数,看看你得到了什么:
$ awk '{sum+=sprintf("%f",$1)}END{printf "%.6f\n%.6f\n",sum,sum/NR}' file
4.534000
0.566750
Run Code Online (Sandbox Code Playgroud)
看起来它可能是你的语言环境,因为你的输出使用一个,小数分隔符,所以发布locale命令的输出.
所以使用你LC_NUMERIC我可以重现你的结果:
$ LC_NUMERIC="de_CH.UTF-8" awk '{sum += $1} END {print sum; print sum / NR}' file
3
0,375
Run Code Online (Sandbox Code Playgroud)
解决方法是设置您LC_NUMERIC或LC_ALL以C或其他任何使用.作为小数点分隔符:
$ LC_NUMERIC="C" awk '{sum += $1} END {print sum; print sum / NR}' file
4.534
0.56675
Run Code Online (Sandbox Code Playgroud)
有关man locale更多信息,请参阅