Odpověď Johna T je způsob, jak jít na hex převody, ale můžete je také udělat tímto způsobem (což lze použít i pro jiné základny):
$ hexval=0x59999
$ hexval=${hexval#*x}
$ echo $((16#$hexval))
367001
Ukázka:
$ echo $((2#1011010))
90
$ echo $((8#1776))
1022
$ echo $((23#mmmmm))
6436342
Upravit:
#!/bin/bash
base=16
while read -r val
do
val=${val#*x}
echo $(($base#$val))
done < inputfile > outputfile
Jedinou výhodou oproti odpovědi Johna T je, že tuto lze snadno upravit pro převod jiných základů na desítkové. Jeho je o něco rychlejší.
Toto gawk
Zdá se, že příkaz je o něco rychlejší než Johnova verze shellu:
gawk --non-decimal-data '{printf "%d\n",$1}' inputfile > outputfile
Je to přibližně stejná rychlost jako váš příkaz v Perlu. Proč to prostě nepoužít?
Mimochodem, poslední část vaší perlové jednolinky může být nahrazena -l
možnost:
perl -lpe '$_=hex'
Další poznámka:Typicky by kanál, který ukazujete ve své otázce, byl napsán jako:
util < file1 > file2
nebo, pokud cat
reprezentuje zástupné symboly, pak by měly být použity fiktivní názvy:
prog1 < file1 | util | prog2 > file2
pak si nebudete muset stěžovat na zbytečné používání cat
.
Normálně používám printf...
while read x;do printf '%d\n' $x;done <file