Odszukaj numer printf na szerokość i zaokrągl go w górę


20

Muszę wydrukować liczbę, ale o podanej szerokości i zaokrąglonej (z awk!)

%10s

Mam to i jakoś muszę połączyć, %dale wszystko, co robię, kończy się zbyt wieloma parametrami dla awk (ponieważ mam więcej kolumn).

Odpowiedzi:


27

Możesz spróbować:

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

Nasza opcja formatu składa się z dwóch części:

  • 3: oznacza, że ​​dane wyjściowe zostaną uzupełnione do 3 znaków.
  • .0f: oznacza, że ​​wynik nie będzie miał precyzji, co oznacza zaokrąglenie w górę.

Od man awkmożesz zobaczyć więcej szczegółów:

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

Używając specyfikatora %fformatu, twój (zmiennoprzecinkowy) numer zostanie automatycznie zaokrąglony w miarę określania. Na przykład, aby zaokrąglić wartość do liczb całkowitych, użyj

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

Jeśli chcesz uzyskać końcowe cyfry, po prostu zmień dokładność.


jest /dev/nullkonieczne?
Avinash Raj

Jeśli twoje jedyne instrukcje są w BEGINbloku, nie ma. Najpierw testowałem z ekspresją w normalnym ciele, a więc mea culpa. Dzięki, @Gnouc.
Andreas Wiese,

3

Awk używa sprintf pod spodem i dokonuje bezstronnego zaokrąglania, więc w zależności od platformy, jeśli chcesz ZAWSZE zaokrąglać w górę, może być konieczne użycie czegoś takiego:

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

Nie zdawanie sobie z tego sprawy może prowadzić do subtelnych, ale paskudnych błędów.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.