使用 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