如何用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

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

现在,我的输出是:

Adrian 50
Bruce 82
Dave 42
Janick 65

但也应该是小数点。

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

我已将代码设为按字母顺序排序。

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

之前的部分

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

我认为你比你想象的更接近,但你的问题源于没有按正确的顺序将各个部分放在一起。默认情况下 awk 处理浮点数学。如果您输入的数字包含小数位,您对 sum[] += 的求和将使用浮点数完成。

为什么要使用 命令替换,例如$(..) 不清楚。不需要用输入的排序总和来填充 temp.txt。让我们以名为 input 的文件中的输入文件为例。然后求和并输出您只需要的值:

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

这导致输出:

Bruce 83.1
Dave 42.7
Adrian 51
Janick 65.4

要对结果进行排序,只需将 awk 输出通过管道传输到 sort,例如

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

结果:

Adrian 51
Bruce 83.1
Dave 42.7
Janick 65.4

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

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

temp.txt 现在包含排序后的输出。为了很好地表格化输出,您可以通过将最大长度保存为 </code> 并将名称字段宽度设置为 <code>max 来格式化输出,然后以固定格式输出浮点数(总浮动-point field-width 10 with 1 digit in the decimal point), 例如

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

或完整形式:

awk '{sum[] += ; len=length(); 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