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.
cuonglm
источник
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) }"

Неосознание этого может привести к тонким, но неприятным ошибкам.

Блейк Барнетт
источник