너비가 awk printf 인 숫자


20

나는 할 필요 는 printf 하지만, 주어진 폭과 둥근로, 숫자 아웃 (AWK와!)

%10s

나는 이것을 가지고 어떻게 든 연결해야 %d하지만 내가하는 모든 일은 awk에 대해 너무 많은 매개 변수로 끝납니다 (더 많은 열이 있기 때문입니다).

답변:


27

당신은 이것을 시도 할 수 있습니다 :

$ awk 'BEGIN{printf "%3.0f\n", 3.6}'
  4

형식 옵션에는 두 부분이 있습니다.

  • 3: 출력은 3 자로 채워집니다.
  • .0f: 출력에는 정밀도가 없으므로 반올림됨을 의미합니다.

에서 man awk자세한 내용을 볼 수 있습니다.

width   The field should be padded to this width. The field is normally padded
        with spaces. If the 0  flag  has  been  used, it is padded with zeroes.

.prec   A number that specifies the precision to use when printing.  For the %e,
        %E, %f and %F, formats, this specifies the number of digits you want
        printed to the right of the decimal point. For the %g, and %G formats,
        it specifies the maximum number of significant  digits. For the %d, %o,
        %i, %u, %x, and %X formats, it specifies the minimum number of digits to
        print. For %s, it specifies the maximum number of characters from the
        string that should be printed.

9

%f형식 지정자를 사용하면 지정한대로 부동 소수점 숫자가 자동으로 반올림됩니다. 예를 들어 값을 정수로 반올림하려면

$ awk 'BEGIN { printf("%.0f\n", 1.49); }'
1
$ awk 'BEGIN { printf("%.0f\n", 1.5); }'
2

더 많은 후행 숫자를 원하면 정밀도를 변경하십시오.


입니다 /dev/null필요?
Avinash Raj

당신의 유일한 진술이 BEGIN블록에 있다면, 그렇지 않습니다. 나는 보통 몸의 표정으로 먼저 테스트를 했으므로 mea culpa. 감사합니다, @Gnouc.
Andreas Wiese

3

Awk는 아래에서 sprintf를 사용하고 편향되지 않은 반올림을 수행하므로 플랫폼에 따라 항상 반올림하려면 다음과 같은 것을 사용해야 할 수도 있습니다.

awk "BEGIN { x+=(5/2); printf('%.0f', (x == int(x)) ? x : int(x)+1) }"

이것을 깨닫지 않으면 미묘하지만 불쾌한 버그가 생길 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.