加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 为什么AWK拒绝总结浮点数

发布时间:2020-12-15 18:57:45 所属栏目:安全 来源:网络整理
导读:我正面临着一个相当奇怪的问题,我想要计算一列的平均值.这是我的文件的测试输入: 120.40.2500.2250.2210.2200.218 这是我正在尝试运行的脚本: awk '{sum += $1} END {print sum; print sum / NR}' ~/Desktop/bar.txt 我期望的输出是: calculated sumcalcu
我正面临着一个相当奇怪的问题,我想要计算一列的平均值.这是我的文件的测试输入:
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 "%.6fn%.6fn",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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读