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진수를 두 개의 마침표로 구분하도록 지정합니다.

strtonum문자열을 숫자로 변환하는 awk 함수입니다. awk에게 숫자가 16진수임을 알리기 위해 0x앞에 "0x"$1or 를 추가합니다 "0x"$2.

관련 정보