之前写的一段数据处理的代码发现结果有问题,最后排查是这段获取字符的ASCII值的方法出问题了。
试了下echo "" | awk '{print sprintf("%d", "a"), sprintf("%c", 97)}'
结果是 0 a
为什么用"%c"
把ASCII码值转字符没问题,用"%d"
反过来就不行了?
因为你用了一般语言的代码逻辑去解释 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 xx", "056x66")}'
输出 56
。echo "" | awk '{print sprintf("%d xx", "x056x66")}'
输出 0
。
解决方法1
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”