使用 AWK,如何将十进制数转换为十六进制数
using AWK, how do I convert a decimal number to hexadecimal
如果我确实有十进制数的输入流,例如
100 2000 599 232
然后我将它们传递给 awk,如何以十六进制表示法打印它们?
例如
0x64 0x74D 0x257 0xE8
正在启动脚本...
echo "100 2000 599 232" | awk '{ print }' #here print in hexa instead of decimal
您可以在 awk 中使用 printf 将格式字符串转换为十六进制:
awk '{ printf "%x\n", }'
快速警告 - mawk 1.3.4 在打印八进制和十六进制代码时有严重的限制:
$ gawk 'BEGIN{ printf("%3.16x\n",8^8*-1-2) }'
0xfffffffffefffffe
$ nawk 'BEGIN{ printf("%3.16x\n",8^8*-1-2) }'
0xfffffffffefffffe
$ mawk 'BEGIN{ printf("%3.16x\n",8^8*-1-2) }'
0000000000000000
$ mawk2 'BEGIN{ printf("%3.16x\n",8^8*-1-2) }'
0xfffffffffefffffe
它甚至没有那么大的值 (-16777218),而且 mawk 1.3.4 完全失败了。另一方面,它可以直接破译一些十六进制常量(只有不在posix或传统模式下的gawk可以直接破译八进制常量:
$ mawk 'BEGIN { OFMT="%.f"; print +"0xDEADBEEF" }'
3735928559
nawk 'BEGIN { OFMT="%.f"; print +"0xDEADBEEF" }'
3735928559
$ mawk2 'BEGIN { OFMT="%.f"; print +"0xDEADBEEF" }'
0
$ gawk --posix 'BEGIN{ OFMT="%.f"; print +"0xDEADBEEF" }'
3735928559 <==== note the difference - posix mode only can decipher strings
the "+" in front is also necessary cuz gawk will just print
it as a string otherwise.
$ gawk -e 'BEGIN { OFMT="%.f"; print 0xDEADBEEF }'
3735928559 <==== standard mode only can decipher clear text ones
- mawk2 is the only one among those above that
even prints anything out with %p in printf(),
but still erroring out, as such
mawk2: line 1: invalid control character 'p'
in [s]printf format ("0x10f0099da
- both gawk and nawk properly prints out %a
如果我确实有十进制数的输入流,例如
100 2000 599 232
然后我将它们传递给 awk,如何以十六进制表示法打印它们?
例如
0x64 0x74D 0x257 0xE8
正在启动脚本...
echo "100 2000 599 232" | awk '{ print }' #here print in hexa instead of decimal
您可以在 awk 中使用 printf 将格式字符串转换为十六进制:
awk '{ printf "%x\n", }'
快速警告 - mawk 1.3.4 在打印八进制和十六进制代码时有严重的限制:
$ gawk 'BEGIN{ printf("%3.16x\n",8^8*-1-2) }'
0xfffffffffefffffe
$ nawk 'BEGIN{ printf("%3.16x\n",8^8*-1-2) }'
0xfffffffffefffffe
$ mawk 'BEGIN{ printf("%3.16x\n",8^8*-1-2) }'
0000000000000000
$ mawk2 'BEGIN{ printf("%3.16x\n",8^8*-1-2) }'
0xfffffffffefffffe
它甚至没有那么大的值 (-16777218),而且 mawk 1.3.4 完全失败了。另一方面,它可以直接破译一些十六进制常量(只有不在posix或传统模式下的gawk可以直接破译八进制常量:
$ mawk 'BEGIN { OFMT="%.f"; print +"0xDEADBEEF" }'
3735928559
nawk 'BEGIN { OFMT="%.f"; print +"0xDEADBEEF" }'
3735928559
$ mawk2 'BEGIN { OFMT="%.f"; print +"0xDEADBEEF" }'
0
$ gawk --posix 'BEGIN{ OFMT="%.f"; print +"0xDEADBEEF" }'
3735928559 <==== note the difference - posix mode only can decipher strings
the "+" in front is also necessary cuz gawk will just print
it as a string otherwise.
$ gawk -e 'BEGIN { OFMT="%.f"; print 0xDEADBEEF }'
3735928559 <==== standard mode only can decipher clear text ones
- mawk2 is the only one among those above that even prints anything out with %p in printf(), but still erroring out, as such mawk2: line 1: invalid control character 'p' in [s]printf format ("0x10f0099da
- both gawk and nawk properly prints out %a