awk中使用sprintf("%d", "a")获取字符的ASCII值,为什么返回的是0?

之前写的一段数据处理的代码发现结果有问题,最后排查是这段获取字符的ASCII值的方法出问题了。
试了下
echo "" | awk '{print sprintf("%d", "a"), sprintf("%c", 97)}'
结果是 0 a
为什么用"%c"把ASCII码值转字符没问题,用"%d"反过来就不行了?

阅读 2.7k
2 个回答

因为你用了一般语言的代码逻辑去解释 awk 脚本。

在 awk 脚本中,"%d" 的含义是将字符串转化为对应的整数。
echo "" | awk '{print sprintf("%d", "5666")}' 输出 5666
echo "" | awk '{print sprintf("%d", "5666.1")}' 输出 5666
echo "" | awk '{print sprintf("%d", "05666.1")}' 输出 5666
echo "" | awk '{print sprintf("%d", "056x66")}' 输出 56
echo "" | awk '{print sprintf("%d", "x056x66")}' 输出 0

解决方法1

来源stackoverflow
echo a | awk 'BEGIN{for(n=0;n<256;n++)ord[sprintf("%c",n)]=n}{print ord[$1]}'

解决方法2

我自己想出来的办法,也结合了上面 stackoverflow 的其它答案:
echo "" | awk '{system("printf \"%d\" \"\047a\"")}'

  • system 表示执行系统命令
  • 需要执行的是 printf "%d" "'a"
  • 这个单引号是必须要的,但是 awk 中不能直接使用,因此使用 \047 代替。
echo "a" | awk '{print ord($0)}'

function ord(str) {
    return sprintf("%d", index("abcdefghijklmnopqrstuvwxyz", str))
}

或者

printf "%d\n" "'a"
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏