2017-01-29 3 views
3

POSIX Awk говорит:% спецификатор преобразования не признал

Оператор Printf должен производить вывод на основе нотации похож на формат нотации файлов, используемый для описания форматов файлов в этом объеме POSIX.1-2008 (см. Обозначение формата файла XBD).

И File Format Notation определяет %a:

Число аргументов с плавающей точкой, представляющий число с плавающей точкой должен быть преобразован в стиле «[-] 0xh.hhhhp ± д» [... ]

Однако ни Gawk ни Mawk поддерживают это:

$ gawk 'BEGIN {printf "%a", 1}' 
%a 

$ mawk 'BEGIN {printf "%a", 1}' 
mawk: run time error: improper conversion(number 1) in printf("%a") 

Почему это?

+2

Лучшее предположение: 'на основе обозначения подобной в' =' идентичную в'. –

+0

Если я пытаюсь использовать POSIX awk, я получаю 'weird printf conversion% a' Получаете ли вы результат, ожидаемый в версии POSIX awk? – dawg

+0

@ dawg, возможно, я не понимаю: POSIX Awk - это Awk, как определено стандартом, а не обязательно какой-либо одной реализацией. Похоже, что никакая реализация не соответствует POSIX с respsect на '% a', или, может быть, я неправильно читаю стандарт –

ответ

2

Вы смотрите документацию POSIX 2008 SUSv4 (Single Unix Specification). Много предварительных дат программного обеспечения, включая gawk. Я подозреваю, что реализация gawk - это 2001 SUSv2, и со временем она не обновлялась полностью. в Linux (glibc) printf(3) man page намекает на эту проблему (см описание %a примерно на полпути через, извините нет якоря для ссылки):

а, А

(C99, а не в SUSv2) Для преобразования двойной аргумент преобразуется в шестнадцатеричную нотацию (используя буквы abcdef) в стиле [-] 0xh.hhhhp ±; [...]

nawk/mawk/gawk не просто вызвать printf() или sprintf() дословно, они более или менее переописать формат обработки строк Базового LibC в. Например, для mawk см. Функцию do_printf() . Perl также реализует собственную обработку формата, а sprintf man page - это более подробная информация о деталях.

Вещи, которые делают поддержку %a/%A являются:

  • Glibc-2,1, а затем (1997), это необходимо для C99 features
  • Coreutils-5,1 (МОГ) printf (т.е. /usr/bin/printf)
  • bash's builtin printf, начиная с bash-2.05, если libc имеет опору
  • perl's sprintf с perl-5.22.0

Смотрите принятый ответ здесь в течение некоторого дополнительного фона: The format specifier %a for printf() in C

Смежные вопросы