awk 中的数字四舍五入

awk 中的数字四舍五入

我正在尝试找到一种方法来四舍五入一些数字。

我找到的主题:https://stackoverflow.com/questions/2395284/round-a-divided-number-in-bash

我在 bash 脚本中使用以下命令..

自由-h | gawk '/Mem:/{print $2}' | awk 'FNR == 1 {print $1 "B"}')

以下代码将显示我安装的总内存量。目前,我获得了 3.7GB。问题是,我需要将其四舍五入到 4GB。

我有一个脚本,它要求我的机器提供大量信息,并将全部回显。 (Prolly 应该使用不同的东西,但还没有尝试过其他任何东西,因为这是我正在从事的项目之一。

内存=$(free -h | gawk '/Mem:/{print $2}' | awk 'FNR == 1 {print $1 "B"}')

回显$内存

现在它回显了 3.7GB,如下所述。我尝试过不同的方法,但似乎无法达到 4GB。

答案1

你可以这样做:

memory=$(
  LC_ALL=C free -h | awk '
    /^Mem/ {
      suffix = $2
      sub(/[0-9.]*/, "", suffix)
      printf "%.0f%sB\n", $2, suffix
    }'
)

LC_ALL=C确保使用.小数基数打印数字(在使用逗号作为小数基数的语言环境中,3.7G 将输出为 3,7G))。

在 GNU/Linux 系统上,您还可以执行以下操作:

memory=$(
  awk '/^MemTotal/{print $2*1024}' < /proc/meminfo |
    numfmt --to=iec --format=%0f --suffix=B
)

或者:

memory=$(
  free -h | awk '/^Mem/{print $2}' |
    numfmt --from=iec --to=iec --format=%0f --suffix=B
)

(处理小数基数不是的区域设置的方法.)。

请注意,free在 Linux 上会报告MemTotal/proc/meminfo 的该字段。根据 proc(5),这就是 可用 RAM 总量(即物理 RAM 减去一些保留位和内核二进制代码)。对于物理 RAM 和 PC,正如 @StephenKit 所指出的,您可能最好使用dmidecode从 BIOS 获取信息,尽管您需要超级用户权限:

physical_memory=$(
  sudo dmidecode -t memory |
    awk '$1 == "Size:" && $2 ~ /^[0-9]+$/ {print $2$3}' |
    numfmt --from=iec --suffix=B |
    awk '{total += $1}; END {print total}' |
    numfmt --to=iec --suffix=B --format=%0f
)

答案2

$ echo "3.7" | awk '{printf("%d\n",$1 + 0.5)}'
4

答案3

如果您想四舍五入到小数点后两位,这里有一些简单的例子:

echo "12345.12345" | nawk '{printf ("%.2f\n", $1+0.005)}'
echo "12345.345" | nawk '{printf ("%.2f\n", $1+0.005)}'

相关内容