Linux-Shell-Utils: Konvertieren Sie eine Liste von Hexadezimalzahlen in eine Liste von Dezimalstellen


7

Wie kann ich eine Datei mit vielen Hex-Zahlen in Dezimalzahlen konvertieren?

Beispiel: Datei1

 0x59999
 0x5acdc
 0xffeff

ich will starten

$ cat file1 | util | cat >file2

und erhalte file2 mit so etwas wie:

 1021489
 1249230
 3458080

(Die Zahlen in der Beispielausgabe sind zufällig, da ich so lange Hex-Zahlen nicht in Dezimalzahlen konvertieren kann.)

UPDATE: Ich habe dies mit dem folgenden Perl-Befehl gelöst:

perl -pe '$_=hex;$_.="\n"'

Gibt es eine bessere Lösung? Die eigentliche Aufgabe besteht darin, Hex-Zahlen sortieren zu können.


Keiner der catBefehle in Ihrer hypothetischen Pipeline sollte erforderlich sein.
Bis auf weiteres angehalten.

@ Tennis Williamson, ja, das sind sie. Aber ich möchte zeigen, dass dieser Befehl in der Pipe /
osgx

Antworten:


7

Die Antwort von John T ist der Weg für Hex-Konvertierungen, aber Sie können sie auch auf diese Weise ausfü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. Sein ist ziemlich viel schneller.

Dieser gawkBefehl 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 benutzen?

Übrigens kann der letzte Teil Ihres Perl-Einzeilers durch die -lOption ersetzt werden:

perl -lpe '$_=hex'

Noch ein Hinweis: Normalerweise wird die Pipeline, die Sie in Ihrer Frage anzeigen, wie folgt geschrieben:

util < file1 > file2

oder, wenn catPlatzhalter dargestellt werden, sollten Dummy-Namen verwendet werden:

prog1 < file1 | util | prog2 > file2

dann werden Sie keine Leute haben, die sich über nutzlose Verwendungen von beschweren cat.


Es ist schwierig, eine 100-MB-Datei mit Hex-Werten zu verwenden - ein Wert pro Zeile.
Osgx

4

Normalerweise benutze ich nur printf ...

while read x;do printf '%d\n' $x;done <file


Dies wird mit Bash Builtins ohne Gabeln gemacht?
Osgx

0
cat file1 | wcalc -q -d -EE -P0 > file2

wcalc sollte zuerst installiert werden


aber perl ist auf vielen installiert.
Osgx

$ wcalc bash: wcalc: Befehl nicht gefunden
osgx

osgx: Wenn Sie Perl-Lösungen wollten, sollten Sie nach dem Stackoverflow gefragt haben. Dies ist keine Programmierwebsite.
John T

Ein bisschen UUOC auch: p
John T

Ich möchte eine Shell-Lösung. AWK, SED kann verwendet werden. PERL
Einzeiler

0

Nur Python funktionierte für mich für längere Hex-Werte wie:

DB50BA84BAEA0BDE2174F1607347C77337498EB90A7C1A5C4860C42A0E84D510A6437A69E7F48421BA05ADD2ED1EAD17F60CC75C12D7CEA73137BC0408AF0242E37E7EE6A4A753C01534EC7C9C9F3156FCA9D3E93FE9963E58C1A1974E70D8D287E4D279F4E3B52048332FF4B63F52ACA85A1B9BE42016C4E57FF015E0C29E9F

Befehl:

python -c 'print(int("DB50BA84BAEA0BDE2174F1607347C77337498EB90A7C1A5C4860C42A0E84D510A6437A69E7F48421BA05ADD2ED1EAD17F60CC75C12D7CEA73137BC0408AF0242E37E7EE6A4A753C01534EC7C9C9F3156FCA9D3E93FE9963E58C1A1974E70D8D287E4D279F4E3B52048332FF4B63F52ACA85A1B9BE42016C4E57FF015E0C29E9F", 16))'

Ergebnis:

154008473420712387404901698031482866054500588587768119192674838113184401106477187614030931854609850184392137108127027338775356787883074794696991150075835606063573780179056429457464518736685347520207122186156775440321726025030196545084526749015303353858750937930411164298939052722221299315903418569137408089759

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.