Arredondando um número no awk

0

Estou tentando encontrar uma maneira de arredondar alguns números.

O tópico que encontrei: link

Estou usando o seguinte comando no meu script bash ...

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

O código a seguir mostrará quanto de memória total eu instalei. Atualmente, estou recebendo 3,7 GB. O problema é que eu preciso que isso seja arredondado para 4GB.

Eu tenho um script que solicita à minha máquina um monte de informações e vai ecoar tudo. (Prolly deve usar algo diferente, mas ainda não tentou mais nada, já que este é um dos meus projetos em que estou trabalhando.

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

echo $memory

Neste momento, o echo apresenta 3,7 GB, como mencionado abaixo. Eu tentei de maneiras diferentes, mas parece que não consigo chegar a 4GB.

    
por TheSebM8 21.03.2018 / 12:50

3 respostas

4

Você pode fazer algo como:

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

( LC_ALL=C para garantir que os números sejam impressos usando a raiz decimal . (3.7G seria exibido como 3,7 G nas localidades usando vírgula como a raiz decimal)).

Nos sistemas GNU / Linux, você também pode fazer:

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

Ou:

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

(aquele que lida com locales onde a raiz decimal não é . ).

Observe que free no Linux informa que MemTotal field de / proc / meminfo. Como por proc (5), esse é o total de RAM utilizável (isto é, RAM física menos alguns bits reservados e o código binário do kernel) . Para a RAM física e para PCs, como apontado pelo @StephenKit, é melhor você usar dmidecode para obter as informações do BIOS, embora você precise de privilégios de superusuário para isso:

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
)
    
por 21.03.2018 / 13:15
0
$ echo "3.7" | awk '{printf("%d\n",$1 + 0.5)}'
4
    
por 21.03.2018 / 13:12
0

Se você quiser arredondar para 2 casas decimais, aqui estão alguns exemplos simples:

echo "12345.12345" | nawk '{printf ("%.2f\n", $1+0.005)}'
echo "12345.345" | nawk '{printf ("%.2f\n", $1+0.005)}'
    
por 01.08.2018 / 20:27

Tags