다음 값을 가진 매우 긴 파일이 있습니다.
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"$1
or 를 추가합니다 "0x"$2
.