Округление числа в awk

Команда alias завершается со статусом 0 и выводит определение именованного псевдонима:

$ alias ls
alias ls='ls -G'
$ echo $?
0

Если псевдоним не определен, в стандартную ошибку выводится ошибка, а alias завершается со статусом 1:

$ alias foo
bash: alias: foo: not found
$ echo $?
1 
0
24.10.2018, 21:46
3 ответа
$ echo "3.7" | awk '{printf("%d\n",$1 + 0.5)}'
4
2
28.01.2020, 02:16

Вы можете сделать что-то вроде:

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 ), это общая используемая оперативная память (, т. е. физическая оперативная память минус несколько зарезервированных битов и двоичный код ядра). Для физической оперативной памяти и для ПК, как указал @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
)
4
28.01.2020, 02:16

Если вы хотите округлить до 2 знаков после запятой, вот несколько простых примеров:

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

Теги

Похожие вопросы