Die Antwort von John T ist der richtige Weg für Hex-Konvertierungen, aber Sie können sie auch auf diese Weise durchführen (die auch für andere Basen verwendet werden kann):
$ hexval=0x59999
$ hexval=${hexval#*x}
$ echo $((16#$hexval))
367001
Demonstration:
$ echo $((2#1011010))
90
$ echo $((8#1776))
1022
$ echo $((23#mmmmm))
6436342
Bearbeiten:
#!/bin/bash
base=16
while read -r val
do
val=${val#*x}
echo $(($base#$val))
done < inputfile > outputfile
Der einzige Vorteil gegenüber der Antwort von John T besteht darin, dass diese leicht angepasst werden kann, um andere Basen in Dezimalzahlen umzuwandeln. Seine ist um einiges schneller.
Dieses gawk
Der Befehl scheint etwas schneller zu sein als Johns Shell-Version:
gawk --non-decimal-data '{printf "%d\n",$1}' inputfile > outputfile
Es ist ungefähr so schnell wie Ihr Perl-Befehl. Warum nicht einfach verwenden?
Übrigens kann der letzte Teil Ihres Perl-Einzeilers durch die -l
ersetzt werden Möglichkeit:
perl -lpe '$_=hex'
Noch ein Hinweis:Normalerweise würde die Pipeline, die Sie in Ihrer Frage zeigen, wie folgt geschrieben:
util < file1 > file2
oder, falls cat
Platzhalter darstellt, dann sollten Dummy-Namen verwendet werden:
prog1 < file1 | util | prog2 > file2
dann haben Sie keine Leute, die sich über die nutzlose Verwendung von cat
beschweren .
Normalerweise verwende ich einfach printf...
while read x;do printf '%d\n' $x;done <file