我有一个很长的文件,其值如下:
0030..0039
2194..2199
21A9..21AA
231A..231B
23E9..23F3
23F8..23FA
25AA..25AB
我想将十六进制转换为十进制格式。我是阅读您可以使用$(($HEX))
,但将上述文件应用于我返回的每个号码:
$((0039))
bash: 0039: value too great for base (error token is "0039")
这里到底出了什么问题,该消息让我认为它知道我想要做什么,而不是$(39)
读取不同的错误。但据说这个数字太大了。
似乎是一个奇怪的错误消息,有人可以解释一下吗?
答案1
以零开头的数字被假定为八进制数。
八进制数的数字应在 0-7 范围内(不能是 8 或 9)。
因此, 9 英寸0039
“对于基础来说价值太大”
不过,这是可行的(假设 0039 是十六进制数字):
$ echo $((0x0039))
57
如果您想要转换数字,请执行以下操作:
$ number=0039
$ printf 'octal=%o decimal=%d hexadecimal=%x\n' "$((0x$number))"{,,}
octal=71 decimal=57 hexadecimal=39
答案2
使用 GNU awk:
$ awk -F'[.][.]' '{printf "%d..%d\n", strtonum("0x"$1), strtonum("0x0"$2)}' file
48..57
8596..8601
8617..8618
8986..8987
9193..9203
9208..9210
9642..9643
-F'[.][.]'
告诉 awk 我们的输入字段由 分隔..
。
该格式"%d..%d\n"
指定我们希望输出中的十进制数字由两个句点分隔。
strtonum
是 awk 将字符串转换为数字的函数。为了告诉 awk 该数字是十六进制,我们0x
在它前面加上"0x"$1
or "0x"$2
。