【问题标题】:awk division without roundingawk 除法不四舍五入
【发布时间】:2020-04-22 16:21:16
【问题描述】:

我正在处理一个包含一系列不同精度的十进制值的文件。 我需要将这些数字除以 100,不需要四舍五入。

awk '{val = $1 / 100; print val}' input_file.txt

输入文件:

0.123456789012
0.123456789012345
0.12345678901234567

输出:

0.00123457
0.00123457
0.00123457

我不想对结果进行四舍五入并得到以下输出:

0.00123456789012
0.00123456789012345
0.0012345678901234567

提前致谢

【问题讨论】:

  • awk 数字不是十进制数,而是二进制浮点数。使用awk -v OFMT=%.17g '...',您可能会获得更高的精度,但正是您期望的输出。如果所有数字都是0.XXXX 的形式,你可以简单地sub(/\./, ".00", $1) ;-)

标签: unix awk


【解决方案1】:

有趣的问题,因为您希望不同数字具有不同的精度。这是一种解决方法

$ awk '{d=length($1); printf "%."d"f\n", $1/100}' file

0.00123456789012
0.00123456789012345
0.0012345678901234567

这也应该涵盖大于 1 的数字。

$ awk '{d=length($1); if($1>1) d+=1-length(int($1)); printf "%."d"f\n", $1/100}' file

可能需要调整负数...

【讨论】:

  • 您可以使用printf "%.*f\n", d, $1/100 提供精度作为 printf 参数,而不是将其连接到格式字符串中。
  • 使用sprinf函数,它会返回一个字符串。
【解决方案2】:

请您尝试关注一下。

awk '{sub(/\./,".00")} 1' Input_file


使用OP的原始命令:

awk '{val = $1 / 100; sub(/\./,".00",val);print val}' input_file.txt

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    相关资源
    最近更新 更多