【问题标题】:%a conversion specifier not recognized%a 转换说明符无法识别
【发布时间】:2017-01-29 02:25:32
【问题描述】:

POSIX Awk 说:

printf 语句应基于类似于 File Format Notation 用于描述本卷中的文件格式 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")

这是为什么?

【问题讨论】:

  • 最佳猜测:based on a notation similar to != identical to
  • 如果我尝试使用 POSIX awk,我会得到 weird printf conversion %a 在 POSIX awk 版本下,您是否得到了您期望的输出?
  • @dawg 也许我不清楚:POSIX Awk 是标准定义的 Awk,不一定是任何一种实现。似乎没有任何实现符合 POSIX 对 %a 的响应,或者我可能误读了标准
  • 根据 Gnu Awk 用户指南:gnu.org/software/gawk/manual/html_node/… %a 不是受支持的格式字符。

标签: awk printf posix gawk mawk


【解决方案1】:

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

一个,一个

(C99; 不在 SUSv2 中) 对于转换,双参数被转换为样式 [-]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

【讨论】:

    猜你喜欢
    • 2018-06-10
    • 2018-11-13
    • 2021-07-11
    • 2017-11-12
    • 2020-04-13
    • 1970-01-01
    • 2013-12-20
    • 2016-10-04
    • 2012-06-30
    相关资源
    最近更新 更多