16進数を10進数に$((0039))

16進数を10進数に$((0039))

次の値を持つ非常に長いファイルがあります。

0030..0039
2194..2199
21A9..21AA
231A..231B
23E9..23F3
23F8..23FA
25AA..25AB

16進数を10進形式に変換したいです。はい読む使用できますが、$(($HEX))返される各番号に上記のファイルを適用します。

$((0039))
bash: 0039: value too great for base (error token is "0039")

$(39)ここで正確に何が間違っているのか、このメッセージは他のエラーを読むのではなく、私が何をしたいのかを知っていると思います。しかし、この数値は高すぎるという。

奇妙なエラーメッセージのようです。誰でも説明できますか?

答え1

0で始まる数字は8進数と見なされます。
8進数は0〜7の範囲でなければなりません(8または9ではありません)。

従って9インチは0039「ベースと比較して余りに大きい価値」である。

ただし、これは機能します(0039が16進数であると仮定)。

$ 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"出力の10進数を2つのピリオドで区切るように指定します。

strtonum文字列を数値に変換する awk 関数です。 awkに数字が16進数であることを知らせるために、0x前に"0x"$1orを追加します"0x"$2

関連情報