如何使用awk计算十六进制数?

如何使用awk计算十六进制数?,awk,hex,Awk,Hex,我有一个包含十六进制数字列表的文件,如0x12345678每行一个 我想计算一下。为此,我考虑使用awk。但是,如果使用printf函数可以轻松地使用awk打印十六进制数,那么除了将十六进制输入解释为文本(或0,转换为整数将在x上停止)之外,我还没有找到其他解释十六进制输入的方法 是否可以打印,例如值+1 awk '{ printf(%x\n", ??????)}' // 0x12345679 编辑:欢迎使用其他语言的一行程序!(如果长度合理;-)只需执行$1+0即可将字符串

我有一个包含十六进制数字列表的文件,如
0x12345678
每行一个

我想计算一下。为此,我考虑使用
awk
。但是,如果使用
printf
函数可以轻松地使用
awk
打印十六进制数,那么除了将十六进制输入解释为文本(或
0
,转换为整数将在
x
上停止)之外,我还没有找到其他解释十六进制输入的方法

是否可以打印,例如值+1

awk '{ printf(%x\n", ??????)}'          // 0x12345679

编辑:欢迎使用其他语言的一行程序!(如果长度合理;-)

只需执行
$1+0
即可将字符串转换为数字。AWK根据需要自动将字符串转换为数字。因此,您可以:

awk '{ printf "%X\n", $1+1; }'
或者如果需要
0x1234
符号:

awk '{ printf "0x%X\n", $1+1; }'

在原始的
nawk
mawk
实现中,可以识别十六进制(和八进制)数字
gawk
(我猜您正在使用)具有不这样做的特性/缺陷。它有一个命令行开关来获取您想要的行为:
--非十进制数据

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

gawk具有
strotnum
功能:

% echo 0x12345678 | gawk '{ printf "%s: %x - %x\n", $1, $1, strtonum($1) }'
0x12345678: 0 - 12345678
也许您根本不需要awk,因为字符串/数字转换很麻烦。Bash版本3和4非常强大。在Bash中使用grep和cut等工具通常更简单、更清晰、更便于携带

例如,在Bash中,十六进制数自然转换为:

$printf“%d”0xDeadBeef
3735928559
$x='0xE';printf“%d%d%d”$x“$x”$(x+1))
14 14 15

希望这有帮助。

这在我的Linux系统(debian)上不起作用:它打印1。我的猜测是,awk试图将值解释为十进制,并在x上的0之后停止,忽略0x是十六进制表示法前缀。它可能不是十六进制数字字符串的答案,但对于十进制数字字符串非常有用。前缀为0的替代方法会将字符串解释为八进制数,但是,mawk似乎仅限于32位数字:
$echo 0xa12345678 | mawk'{printf”%s:%x\n“,$1,$1}'0xa12345678:7fffffff
% echo 0x12345678 | gawk '{ printf "%s: %x - %x\n", $1, $1, strtonum($1) }'
0x12345678: 0 - 12345678