[英]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
,然后以固定格式输出浮点数(总浮点字段宽度10
和1
小数点后的数字),例如
{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.