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는 다른 것을 사용해야 하지만 이것이 제가 작업 중인 프로젝트 중 하나이기 때문에 아직 다른 것을 시도하지 않았습니다.

메모리=$(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 양(예: 물리적 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

소수점 이하 두 자리로 반올림하려는 경우 다음과 같은 몇 가지 간단한 예가 있습니다.

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

관련 정보