).png)
次の値を持つ非常に長いファイルがあります。
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"$1
orを追加します"0x"$2
。