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
.