% спецификатор конверсии не распознан

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

Другие вопросы по тегам