% спецификатор конверсии не распознан
POSIX Awk говорит:
Оператор printf должен выводить данные на основе нотации, аналогичной нотации формата файла, используемой для описания форматов файлов в этом томе POSIX.1-2008 (см. Нотация формата файла XBD).
И формат файла определяет %a
:
Аргумент числа с плавающей точкой, представляющий число с плавающей точкой, должен быть преобразован в стиле "[-]0xh.hhhhp±d" [...]
Однако ни Гавк, ни Мавк не поддерживают это:
$ gawk 'BEGIN {printf "%a", 1}'
%a
$ mawk 'BEGIN {printf "%a", 1}'
mawk: run time error: improper conversion(number 1) in printf("%a")
Почему это?
1 ответ
Вы смотрите документацию по POSIX 2008 SUSv4 ( Single Unix Specification). Много программного обеспечения предшествует этому, gawk
включен. Я подозреваю gawk
реализация 2001 SUSv2, и она не была полностью обновлена с течением времени. Linux (glibc) printf(3)
Страница man ссылается на эту проблему (см. описание %a
примерно на полпути, извините, якорей нет, чтобы ссылаться на)
а, а
(C99; не в SUSv2) Для преобразования двойной аргумент преобразуется в шестнадцатеричное представление (с использованием букв abcdef) в стиле [-] 0xh.hhhhp ±; [...]
nawk
/ mawk
/ gawk
не просто вызывать базовый libc printf()
или же sprintf()
дословно они более-менее переопределяют формат строки обработки. За mawk
увидеть do_printf()
функция например. Perl также реализует свою собственную обработку формата, sprintf
Страница man более подробно о деталях.
Вещи, которые поддерживают %a
/ %A
являются:
- glibc-2.1 и более поздние версии (1997), требуется для функций C99
- Coreutils-5,1(МОГ)
printf
(т.е./usr/bin/printf
) - встроенный Bash
printf
, так как bash-2.05, если libc имеет поддержку - в Perl
sprintf
начиная с perl-5.22.0
См. Принятый ответ здесь для дополнительной информации: Спецификатор формата%a для printf() в C