%无法识别转换说明符

时间:2017-01-29 02:25:32

标签: awk printf posix gawk mawk

POSIX Awk说:

  

printf语句应根据类似于的符号生成输出   文件格式表示法用于描述此卷中的文件格式   POSIX.1-2008(参见XBD文件格式表示法)。

File Format Notation定义%a

  

表示浮点数的浮点数参数   转换为“[ - ] 0xh.hhhhp±d”[...]

的样式

然而,Gawk和Mawk都不支持这个:

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

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

为什么会这样?

1 个答案:

答案 0 :(得分:2)

您正在查看POSIX 2008 SUSv4(Single Unix Specification)文档。很多软件都在此之前,gawk包括在内。我怀疑gawk实现是2001 SUSv2,并且还没有完全更新。 Linux(glibc)printf(3) man page提到了这个问题(请参阅%a的描述大约一半,抱歉没有链接的锚点):

  

a,A

     

(C99;不在SUSv2中)对于转换,double参数在样式[ - ] 0xh.hhhhp±中转换为十六进制表示法(使用字母abcdef); [...]

nawk / mawk / gawk不要简单地逐字调用基础libc的printf()sprintf(),它们或多或少地重新实现格式字符串处理。对于mawk,请参阅do_printf() 例如,功能。 Perl还实现了自己的格式处理,sprintf man page更加关注细节。

支持%a / %A的事情是:

  • glibc-2.1及更高版本(1997),它是C99 features
  • 所必需的
  • coreutils-5.1(ish)printf(即/usr/bin/printf
  • bash的内置printf,因为如果libc支持bash-2.05
  • perl的sprintf,因为perl-5.22.0

请参阅此处接受的答案,了解其他一些背景知识:The format specifier %a for printf() in C