如何用awk对十六进制数进行计算?
问题描述:
我有一个包含十六进制数字列表的文件,如0x12345678
每行一个。如何用awk对十六进制数进行计算?
我想对它们进行计算。为此,我想到了使用awk
。但如果用awk
打印十六进制数字很容易使用printf
函数,我还没有找到一种方法来解释十六进制输入而不是文本(或0
,转换为整数在x
停止)。
awk '{ print $1; }' // 0x12345678
awk '{ printf("%x\n", $1)}' // 0
awk '{ printf("%x\n", $1+1)}' // 1 // DarkDust answer
awk '{ printf("%s: %x\n", $1, $1)}' // 0x12345678: 0
是否可以打印,例如:值+1?
awk '{ printf(%x\n", ??????)}' // 0x12345679
编辑:在其他语言中的一种衬里的欢迎! (如果合理长度;-))
答
在原有nawk
和mawk
实现十六进制(和八进制)数的认可。 gawk
(我猜你正在使用)有没有这样做的功能/错误。它有一个命令行开关来获得你想要的行为:--non-decimal-data
。
echo 0x12345678 | mawk '{ printf "%s: %x\n", $1, $1 }'
0x12345678: 12345678
echo 0x12345678 | gawk '{ printf "%s: %x\n", $1, $1 }'
0x12345678: 0
echo 0x12345678 | gawk --non-decimal-data '{ printf "%s: %x\n", $1, $1 }'
0x12345678: 12345678
答
只需通过执行$1 + 0
即可将字符串转换为数字。 AWK根据需要自动将字符串转换为数字。所以,你可以这样做:
awk '{ printf "%X\n", $1+1; }'
,或者如果你想0x1234
符号:
awk '{ printf "0x%X\n", $1+1; }'
答
GAWK具有strtonum
功能:
% echo 0x12345678 | gawk '{ printf "%s: %x - %x\n", $1, $1, strtonum($1) }'
0x12345678: 0 - 12345678
答
也许你并不需要AWK所有的,因为串/数转换毛。 Bash版本3和4非常强大。它往往是更简单,更清晰,更便携留在猛砸,也许使用的grep和削减等
例如,在猛砸十六进制数字自然转换:
$ printf "%d" 0xDeadBeef
3735928559
$ x='0xE'; printf "%d %d %d" $x "$x" $((x + 1))
14 14 15
希望这有助于。
这不适用于我的Linux系统(debian):它打印出1.我的猜测是,awk尝试将值解释为十进制,并在x后面的0处停止,忽略0x是十六进制符号前缀。 – 2010-09-10 08:27:25