La réponse de John T est la voie à suivre pour les conversions hexadécimales, mais vous pouvez également les faire de cette façon (qui peut également être utilisée pour d'autres bases) :
$ hexval=0x59999
$ hexval=${hexval#*x}
$ echo $((16#$hexval))
367001
Démonstration :
$ echo $((2#1011010))
90
$ echo $((8#1776))
1022
$ echo $((23#mmmmm))
6436342
Modifier :
#!/bin/bash
base=16
while read -r val
do
val=${val#*x}
echo $(($base#$val))
done < inputfile > outputfile
Le seul avantage par rapport à la réponse de John T est que celle-ci peut être facilement adaptée pour convertir d'autres bases en décimal. Le sien est un peu plus rapide.
Ce gawk
semble être un peu plus rapide que la version shell de John :
gawk --non-decimal-data '{printf "%d\n",$1}' inputfile > outputfile
C'est à peu près la même vitesse que votre commande Perl. Pourquoi ne pas simplement l'utiliser ?
Au fait, la dernière partie de votre one-liner Perl peut être remplacée par le -l
choix :
perl -lpe '$_=hex'
Autre remarque :en règle générale, le pipeline que vous montrez dans votre question s'écrit :
util < file1 > file2
ou, si cat
représente des espaces réservés, alors les noms factices doivent être utilisés :
prog1 < file1 | util | prog2 > file2
alors vous n'aurez pas de gens se plaignant des utilisations inutiles de cat
.
J'utilise normalement juste printf...
while read x;do printf '%d\n' $x;done <file