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

Did*_*set 6 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
Run Code Online (Sandbox Code Playgroud)

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

awk '{ printf(%x\n", ??????)}'          // 0x12345679
Run Code Online (Sandbox Code Playgroud)

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

sch*_*hot 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
Run Code Online (Sandbox Code Playgroud)


gle*_*man 7

gawk具有以下strtonum功能:

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


And*_*ler 5

也许你根本不需要awk ,因为字符串/数字转换很复杂。Bash版本 3 和 4 非常强大。留在Bash中通常更简单、更清晰、更便携,也许还可以使用grepcut等。

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

$ printf "%d" 0xDeadBeef
3735928559
$ x='0xE'; printf "%d %d %d" $x "$x" $((x + 1))
14 14 15
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。