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

时间:2010-09-10 08:15:55

标签: awk hex

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

我想对它们进行计算。为此,我想到了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

编辑:欢迎其他语言的一个衬垫! (如果合理的长度;-))

4 个答案:

答案 0 :(得分:18)

在原始nawkmawk实现中,识别十六进制(和八进制)数字。 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 :(得分:7)

gawk具有strtonum功能:

% echo 0x12345678 | gawk '{ printf "%s: %x - %x\n", $1, $1, strtonum($1) }'
0x12345678: 0 - 12345678

答案 2 :(得分:3)

也许你根本不需要 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

希望这有帮助。

答案 3 :(得分:1)

只需执行$1 + 0即可将字符串转换为数字。 AWK根据需要自动将字符串转换为数字。所以你可以这样做:

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

或者如果您想要0x1234符号:

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