La respuesta de John T es el camino a seguir para las conversiones hexadecimales, pero también puede hacerlo de esta manera (que también puede usarse para otras bases):
$ hexval=0x59999
$ hexval=${hexval#*x}
$ echo $((16#$hexval))
367001
Demostración:
$ 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
La única ventaja sobre la respuesta de John T es que esta se puede adaptar fácilmente para convertir otras bases a decimal. El suyo es un poco más rápido.
Este gawk
El comando parece ser un poco más rápido que la versión de shell de John:
gawk --non-decimal-data '{printf "%d\n",$1}' inputfile > outputfile
Tiene aproximadamente la misma velocidad que su comando Perl. ¿Por qué no simplemente usarlo?
Por cierto, la última parte de tu frase de Perl se puede reemplazar por el -l
opción:
perl -lpe '$_=hex'
Otra nota:por lo general, la canalización que muestra en su pregunta se escribiría como:
util < file1 > file2
o, si cat
representa marcadores de posición, entonces se deben usar nombres ficticios:
prog1 < file1 | util | prog2 > file2
entonces no tendrás gente quejándose de los usos inútiles de cat
.
Normalmente solo uso printf...
while read x;do printf '%d\n' $x;done <file