Umwandlung von hex zu dezimal in awk oder sed
Habe ich eine Liste von zahlen, durch Komma getrennt:
123711184642,02,3583090366663629,639f02012437d4
123715942138,01,3538710295145500,639f02afd6c643
123711616258,02,3548370476972758,639f0200485732
Muss ich split der 3. Säule in die drei wie folgt:
123711184642,02,3583090366663629,639f02,0124,37d4
123715942138,01,3538710295145500,639f02,afd6,c643
123711616258,02,3548370476972758,639f02,0048,5732
Umwandeln und die Ziffern der beiden letzten Spalten in dezimal:
123711184642,02,3583090366663629,639f02,292,14292
123715942138,01,3538710295145500,639f02,45014,50755
123711616258,02,3548370476972758,639f02,72,22322
InformationsquelleAutor der Frage bernie | 2011-01-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine variation auf Jonathan ' s Antwort:
Habe ich eine ziemlich verdrehte Art und Weise der Zugabe der --non-decimal-data option, wenn es notwendig ist.
Bearbeiten
Nur für das heck der es, hier ist das Reine Bash-äquivalent:
Den
"${line[*]:0:3}"
(zitiert*
) funktioniert ähnlich wie AWK istOFS
ist, dass es bewirkt, dass die Bash istIFS
(hier ein Komma) eingefügt werden zwischen den array-Elementen bei der Ausgabe. Wir nehmen außerdem den Vorteil, dass die Funktion durch einfügen von array-Elementen wie folgt die genauer parallels mein AWK-version vor.Leider Bash nicht erlauben
printf -v
(das ist ähnlich wiesprintf()
) für die Zuweisungen an array-Elemente, soprintf -v "line[6]" ...
funktioniert nicht. Edit: Als der Bash 4.1,printf -v
können nun die Zuweisungen an array-Elemente.InformationsquelleAutor der Antwort Dennis Williamson
Diese scheint zu funktionieren:
Ihre Probe-input-Daten, die es produziert:
Die string-Verkettung von '0x' und die 4-stelligen hex, gefolgt von Zugabe von 0 Kräfte
awk
zur Behandlung der Zahl als hexadezimal.Kann man vereinfachen zu:
Die Zeichenfolgen mit dem Präfix " 0x gezwungen sind, eine ganze Zahl, wenn die Darstellung zu
printf()
und die%d
format.Den code oben funktioniert wunderbar mit den einheimischen
awk
auf MacOS X 10.6.5 (version 20070501); leider, es funktioniert nicht mit GNUgawk
3.1.7. Das, so scheint es, erlaubt ist Verhalten gemäß POSIX (siehe die Kommentare unten). Allerdingsgawk
hat eine nicht-standard Funktionstrtonum
können verwendet werden, um die Keule es in der Durchführung richtig - schade, dass Schlagwaffen notwendig ist.InformationsquelleAutor der Antwort Jonathan Leffler
Von AWK
Diese Antwort konzentriert sich auf die zeigen, wie die Umwandlung von awk tragbar.
Mit
--non-decimal-data
für gawk ist nicht empfohlen nach GNU Awk-Benutzerhandbuch. Und mitstrtonum()
ist nicht tragbar.In den folgenden Beispielen das erste Wort von jedem Datensatz umgewandelt wird.
Von Benutzer-definierten Funktion
Den meisten tragbaren Weise zu tun, die Konvertierung wird durch einen Benutzer-definierten awk-Funktion [Referenz]:
Durch aufrufen von shell printf
Können Sie diese
aber es ist relativ langsam. Das folgende ist schneller, wenn Sie viele newline getrennte hexadezimal-zahlen umwandeln:
Könnte es ein problem wenn sehr viele Argumente sind die für die einzelne printf-Befehl.
In Linux
Meiner Erfahrung die folgenden Werke in Linux:
Getestet habe ich es von gawk, mawk und original-awk in Ubuntu Linux 14.04. Original-awk zeigt der Befehl eine Warnmeldung, aber Sie können es verstecken, durch die Umleitung der Richtlinie
2>/dev/null
in der Schale. Wenn Sie nicht möchten, dass zu tun, können Sie Streifen die-Wposix
im Falle der original-awk so:(In der Bash 4 Sie ersetzen könnte
>/dev/null 2>&1
durch&>/dev/null
)Hinweis: Die-Wposix trick wohl nicht funktioniert mit nawk, die in OS X und einigen BSD-OS-Varianten, obwohl.
InformationsquelleAutor der Antwort jarno
Den oben genannten Befehl druckt den Inhalt von "all_info_List.csv", eine Datei, in denen der Feldtrenner ist "|".
Dann nimmt Feld 21 (MAC-Adresse) und teilt es mit field separator ":".
Es tritt die variable "
p1
" die ersten 5 bytes der einzelnen mac-Adresse, so dass, wenn wir hatten diese mac-Adresse:"11:22:33:44:55:66",p1
wäre: "11:22:33:44:55:".p2
zugeordnet ist, mit dem dezimalen Wert des letzten byte: "0x66" weisen "102" dezimal zup2
.Endlich, ich bin mit
printf
beitretenp1
undp2
, während die Umwandlung vonp2
zurück zu hex, nach dem hinzufügen einer.InformationsquelleAutor der Antwort Sophoclis
Könnte dies für Sie arbeiten (GNU sed & printf):
Split die letzten acht Zeichen und Leerzeichen einfügen, vor der Felder durch die hex-id und bewerten Sie dann die ganze Zeile mit printf.
InformationsquelleAutor der Antwort potong
InformationsquelleAutor der Antwort user164485
Perl-version, mit einem Tipp der Hut, um @Jonathan:
-a
einschalten automatisches aufteilen in mode, zum Auffüllen der@F
array-F,
änderungen der automatisches aufteilen in separator,
(Standard ist das Leerzeichen)Die
substr()
Indizes sind 1 weniger als Ihre awk-äquivalente, da Perl die arrays beginnen von 0.Ausgabe:
InformationsquelleAutor der Antwort Chris Koknat