繁体   English   中英

如何使用 awk 打印浮点数

[英]How to print float numbers with awk

我有这个输入文件:

Adrian 20.6
Bruce 40.2
Adrian 30.4
Janick 24.2
Dave 42.7
Bruce 42.9
Janick 41.2

有了我在这里得到的答案,我能够对数字求和,但现在数字是浮动的,我不知道如何打印它们。

目前,我的 output 是:

Adrian 50
Bruce 82
Dave 42
Janick 65

但它也应该是小数。

$(awk '{sum[$1] += $2} END {for (i in sum) print i, sum[i]}' $arq > temp.txt && sort temp.txt)

我已经将该代码按字母顺序排序。

您处于小数点分隔符不是 的语言环境中. 所以. 被视为不属于数字的任何其他字符(例如a@ ),因此您的数字被截断为. .

执行LC_ALL=C awk '...'将您的语言环境设置为使用. 对于小数点分隔符,然后您的脚本将按原样工作。

我认为你比你想象的更接近,但你的问题源于没有处理以正确的顺序组合在一起。 默认情况下awk处理浮点数学。 如果您的输入数字包含小数位,则sum[$1] += $2的总和将使用浮点数完成。

为什么您使用Command Substitution ,例如$(..)尚不清楚。 不需要用您输入的排序总和填充temp.txt 让我们以一个名为input的文件中的输入文件为例。 然后总结和 output 你需要的值不外乎:

awk '{sum[$1] += $2} END {for (i in sum) print i, sum[i]}' input

这导致 output 为:

Bruce 83.1
Dave 42.7
Adrian 51
Janick 65.4

要对结果进行排序,只需 pipe awk output 进行sort ,例如

awk '{sum[$1] += $2} END {for (i in sum) print i, sum[i]}' input | sort

结果:

Adrian 51
Bruce 83.1
Dave 42.7
Janick 65.4

现在,要填充temp.txt ,您只需将 output 重定向到temp.txt ,例如

awk '{sum[$1] += $2} END {for (i in sum) print i, sum[i]}' input | sort > temp.txt

temp.txt现在包含排序后的 output。 为了很好地将 output 表格化,您可以格式化 output,方法是将最大长度保存为$1 ,并将名称字段宽度设置为max ,然后以固定格式输出浮点数(总浮点字段宽度101小数点后的数字),例如

{sum[$1] += $2; len=length($1); if(len>max)max=len} ...  printf "%-*s%10.1f\n", max, i, sum[i]

或完整形式:

awk '{sum[$1] += $2; len=length($1); if(len>max)max=len} END {for (i in sum) printf "%-*s%10.1f\n", max, i, sum[i]}' input | sort > temp.txt

temp.txt中的结果现在是:

$ cat temp.txt
Adrian      51.0
Bruce       83.1
Dave        42.7
Janick      65.4

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM