Awk printf номер по ширині і округніть його


20

Мені потрібно роздрукувати число, але з заданою шириною і закругленою (з 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необхідно?
Авінаш Радж

Якщо ваші єдині заяви є в BEGINблоці, це не так. Я спробував спочатку вираз у нормальному тілі, таким чином, я міняюсь. Дякую, @Gnouc.
Андреас Візе

3

Awk використовує sprintf під ним, і це робить неупереджене округлення, тому залежно від вашої платформи, якщо ви хочете, щоб ЗАВЖДИ це округлити, можливо, вам доведеться використовувати щось подібне:

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

Не усвідомлення цього може призвести до тонких, але неприємних помилок.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.