3

POSIX awk说:

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

文件格式符号定义:%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")

为什么是这样?

4

1 回答 1

3

您正在查看 POSIX 2008 SUSv4(单一 Unix 规范)文档。很多软件都早于这个,gawk包括。我怀疑gawk实现是 2001 SUSv2,并且随着时间的推移还没有完全更新。Linux (glibc)printf(3)手册页暗示了这个问题(见%a大约一半的描述,抱歉没有锚链接到):

一个,一个

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

nawk//不要简单地调用底层的libcmawk或者逐字逐句,它们或多或少地重新实现了格式化字符串处理。以查看 功能为例。Perl 也实现了自己的格式处理,手册页更详细地介绍了细节。gawkprintf()sprintf()mawkdo_printf()sprintf

支持/的事情%a%A

  • glibc-2.1 及更高版本 (1997),它是C99 功能所必需的
  • coreutils-5.1(ish) printf(即/usr/bin/printf)
  • bash 的 builtin printf,如果 libc 有支持,则从 bash-2.05 开始
  • perlsprintf从 perl-5.22.0 开始

有关其他背景,请参见此处接受的答案:C 中 printf() 的格式说明符 %a

于 2017-02-22T17:19:50.343 回答