Linux shell utils: converte uma lista de hexadecimais em uma lista de decimais

7

Como posso converter um arquivo com muitos números hexadecimais em decimais?

Exemplo: arquivo1

 0x59999
 0x5acdc
 0xffeff

Eu quero começar

$ cat file1 | util | cat >file2

e obtenha o arquivo2 com algo como:

 1021489
 1249230
 3458080

(Os números na saída do exemplo são aleatórios, pois não consigo converter números hexadecimais tão longos em decimais)

UPDATE: resolvi isso com o seguinte comando Perl:

perl -pe '$_=hex;$_.="\n"'

Existe uma solução melhor? A tarefa real precisa ser capaz de classificar números hexadecimais.

    
por osgx 27.12.2010 / 17:08

3 respostas

7

A resposta de John T é o caminho a seguir para conversões hexadecimais, mas você também pode fazê-las desta forma (que também pode ser usada para outras bases):

$ hexval=0x59999
$ hexval=${hexval#*x}
$ echo $((16#$hexval))
367001

Demonstração:

$ echo $((2#1011010))
90
$ echo $((8#1776))
1022
$ echo $((23#mmmmm))
6436342

Editar:

#!/bin/bash
base=16
while read -r val
do
    val=${val#*x}
    echo $(($base#$val))
done < inputfile > outputfile

A única vantagem em relação à resposta de John T é que esta pode ser facilmente adaptada para converter outras bases em decimais. Ele é um pouco mais rápido.

Este comando gawk parece ser um pouco mais rápido que a versão do shell de John:

gawk --non-decimal-data '{printf "%d\n",$1}' inputfile > outputfile

É quase a mesma velocidade do seu comando Perl. Por que não apenas usá-lo?

A propósito, a última parte do seu one-liner Perl pode ser substituída pela opção -l :

perl -lpe '$_=hex'

Outra observação: normalmente, o pipeline mostrado na sua pergunta seria escrito como:

util < file1 > file2

ou, se cat representar espaços reservados, então os nomes fictícios devem ser usados:

prog1 < file1 | util | prog2 > file2

você não terá pessoas reclamando sobre usos inúteis de cat .

    
por 27.12.2010 / 21:14
4

Eu normalmente uso printf ...

while read x;do printf '%d\n' $x;done <file

    
por 27.12.2010 / 20:07
0
cat file1 | wcalc -q -d -EE -P0 > file2

O wcalc deve ser instalado primeiro

    
por 27.12.2010 / 18:45