awkで数値を丸める

awkで数値を丸める

いくつかの数を丸める方法を見つけようとしています。

私が見つけたトピック:https://stackoverflow.com/questions/2395284/round-a-divided-number-in-bash

Bashスクリプトで次のコマンドを使用しています。

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

次のコードは、私がインストールしたメモリの合計量を示しています。現在3.7GBを使用しています。問題は、4GBに丸める必要があるということです。

私のコンピュータに多くの情報を要求し、その情報をすべて再表示するスクリプトがあります。 (Prollyは他のものを使用する必要がありますが、これが私が作業しているプロジェクトの1つであるため、まだ他のことを試していません。

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

$memory エコ

ここで、以下に説明するように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
)

(小数点の下ではなくロケールを処理する方法.

/ proc / meminfoのこのフィールドはfreeLinuxで報告されます。MemTotalproc(5) によると、これは次のようになります。 使用可能な合計RAMの量。 @StephenKitが指摘したように、物理RAMとPCの場合は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

小数点以下の2桁に丸めたい場合は、次のような簡単な例があります。

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

関連情報