我有一个包含十六进制数字列表的文件,每行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
编辑:欢迎其他语言的一个衬垫! (如果合理的长度;-))
答案 0 :(得分:18)
在原始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 :(得分: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; }'