Hexadecimals para decimal $ ((0039))

0

Eu tenho um arquivo longo com valores como este:

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

Eu quero converter os hexadecimais para o formato decimal. Eu estou lendo que você pode usar $(($HEX)) mas com o arquivo acima aplicável a cada número que eu recebo:

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

O que exatamente está errado aqui, a mensagem me faz pensar que sabe o que eu quero fazer, ao contrário de $(39) , que lê um erro diferente. Mas diz que o número é grande.

Parece uma estranha mensagem de erro, alguém pode explicar?

    
por Philip Kirkbride 22.08.2017 / 04:31

2 respostas

2

Um número que começa com um zero é considerado um número octal.
Os números octais devem ter dígitos no intervalo de 0 a 7 (não 8 ou 9).

O 9 em 0039 é, portanto, "valor muito grande para a base"

Isso funciona, no entanto, (supondo que o 0039 seja um número hexadecimal):

$ echo $((0x0039))
57

Se você quiser o número convertido, faça:

$ number=0039
$ printf 'octal=%o decimal=%d hexadecimal=%x\n' "$((0x$number))"{,,}
octal=71 decimal=57 hexadecimal=39
    
por 22.08.2017 / 04:47
2

Usando o 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'[.][.]' diz ao awk que nossos campos de entrada estão separados por .. .

O formato "%d..%d\n" especifica que queremos números decimais na saída separados por dois períodos.

strtonum é a função do awk para converter uma string em um número. Para dizer ao awk que o número é hexadecimal, colocamos 0x na frente dele como em "0x"$1 ou "0x"$2 .

    
por 22.08.2017 / 04:57

Tags