La risposta di John T è la strada da percorrere per le conversioni esadecimali, ma puoi anche farle in questo modo (che può essere utilizzato anche per altre basi):
$ hexval=0x59999
$ hexval=${hexval#*x}
$ echo $((16#$hexval))
367001
Dimostrazione:
$ echo $((2#1011010))
90
$ echo $((8#1776))
1022
$ echo $((23#mmmmm))
6436342
Modifica:
#!/bin/bash
base=16
while read -r val
do
val=${val#*x}
echo $(($base#$val))
done < inputfile > outputfile
L'unico vantaggio rispetto alla risposta di John T è che questa può essere facilmente adattata per convertire altre basi in decimale. Il suo è un po' più veloce.
Questo gawk
command sembra essere un po' più veloce della versione della shell di John:
gawk --non-decimal-data '{printf "%d\n",$1}' inputfile > outputfile
È più o meno la stessa velocità del tuo comando Perl. Perché non usarlo semplicemente?
A proposito, l'ultima parte della tua battuta Perl può essere sostituita dal -l
opzione:
perl -lpe '$_=hex'
Un'altra nota:in genere la pipeline che mostri nella tua domanda sarebbe scritta come:
util < file1 > file2
o, se cat
rappresenta segnaposto, quindi dovrebbero essere usati nomi fittizi:
prog1 < file1 | util | prog2 > file2
allora non ci saranno persone che si lamenteranno degli usi inutili di cat
.
Normalmente uso solo printf...
while read x;do printf '%d\n' $x;done <file