2010-09-10 181 views
4

我有一个包含十六进制数字列表的文件,如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 

编辑:在其他语言中的一种衬里的欢迎! (如果合理长度;-))

回答

15

在原有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 
0

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

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

,或者如果你想0x1234符号:

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

这不适用于我的Linux系统(debian):它打印出1.我的猜测是,awk尝试将值解释为十进制,并在x后面的0处停止,忽略0x是十六进制符号前缀。 – 2010-09-10 08:27:25

6

GAWK具有strtonum功能:

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

也许你并不需要AWK所有的,因为串/数转换毛。 Bash版本3和4非常强大。它往往是更简单,更清晰,更便携留在猛砸,也许使用的grep削减

例如,在猛砸十六进制数字自然转换:

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

希望这有助于。