如何用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
我有这个输入文件:
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