Гексадецималы до десятичных чисел $ ((0039))

У меня длинный файл со значениями вроде этого:

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

Я хочу преобразовать hexadecimals в десятичный формат. Я читаю, что вы можете использовать $(($HEX)) но с указанным выше файлом, применяемым к каждому номеру, который я возвращаю:

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

Что именно здесь происходит, сообщение заставляет меня думать, что он знает, что я хочу делать, в отличие от $(39) который читает другую ошибку. Но он говорит, что число велико.

Похоже на странное сообщение об ошибке, может кто-нибудь объяснить?

Число, начинающееся с нуля, считается восьмеричным числом.
Восьмеричные цифры должны иметь цифры в диапазоне 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 

Использование 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 или "0x"$2 .