之前写的一段数据处理的代码发现结果有问题,最后排查是这段获取字符的ASCII值的方法出问题了。
试了下echo "" | awk '{print sprintf("%d", "a"), sprintf("%c", 97)}'
结果是 0 a
为什么用"%c"
把ASCII码值转字符没问题,用"%d"
反过来就不行了?
之前写的一段数据处理的代码发现结果有问题,最后排查是这段获取字符的ASCII值的方法出问题了。
试了下echo "" | awk '{print sprintf("%d", "a"), sprintf("%c", 97)}'
结果是 0 a
为什么用"%c"
把ASCII码值转字符没问题,用"%d"
反过来就不行了?
echo "a" | awk '{print ord($0)}'
function ord(str) {
return sprintf("%d", index("abcdefghijklmnopqrstuvwxyz", str))
}
或者
printf "%d\n" "'a"
1 回答2.7k 阅读✓ 已解决
2 回答1.7k 阅读✓ 已解决
2 回答1.7k 阅读✓ 已解决
2 回答1.3k 阅读
2 回答1.1k 阅读✓ 已解决
3 回答1.7k 阅读
1 回答1.1k 阅读✓ 已解决
因为你用了一般语言的代码逻辑去解释 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"
\047
代替。