Drucken von langen Ganzzahlen, die in awk
Habe ich eine pipe-delimited-feed Datei, die mehrere Felder. Da ich nur ein paar, ich dachte, der Verwendung von awk
zu erfassen, Sie für meine Testzwecke. Jedoch, ich bemerkte, dass printf
, ändert sich der Wert wenn ich "%d"
. Es funktioniert gut, wenn ich "%s"
.
- Feed-Datei Beispiel:
[jaypal:~/Temp] cat temp
302610004125074|19769904399993903|30|15|2012-01-13 17:20:02.346000|2012-01-13 17:20:03.307000|E072AE4B|587244|316|13|GSM|1|SUCC|0|1|255|2|2|0|213|2|0|6|0|0|0|0|0|10|16473840051|30|302610|235|250|0|7|0|0|0|0|0|10|54320058002|906|722310|2|0||0|BELL MOBILITY CELLULAR, INC|BELL MOBILITY CELLULAR, INC|Bell Mobility|AMX ARGENTINA SA.|Claro aka CTI Movil|CAN|ARG|
Ich bin interessiert bei der Erfassung der second column
die 19769904399993903
.
Hier meine tests:
[jaypal:~/Temp] awk -F"|" '{printf ("%d\n",$2)}' temp
19769904399993904 # Value is changed
Jedoch die folgenden beiden tests gut funktioniert -
[jaypal:~/Temp] awk -F"|" '{printf ("%s\n",$2)}' temp
19769904399993903 # Value remains same
[jaypal:~/Temp] awk -F"|" '{print $2}' temp
19769904399993903 # Value remains same
So ist dies ein limit von "%d"
nicht in der Lage zu handhaben, lange Ganzzahlen. Wenn das der Fall ist, warum würde er hinzufügen, um die Nummer statt des vielleicht abschneiden?
Habe ich versucht dies mit BSD
und GNU
Versionen von awk
.
Version Info:
[jaypal:~/Temp] gawk --version
GNU Awk 4.0.0
Copyright (C) 1989, 1991-2011 Free Software Foundation.
[jaypal:~/Temp] awk --version
awk version 20070501
printf "%17.0f\n"
? Meine Erfahrung mit awk sagt, Stelle diese Frage auf comp.lang.awk. Viel Glück!Danke @shellter. Ich bekam das gleiche Ergebnis. Erstaunlicherweise passiert es nur innerhalb der
awk
. Wenn ich printf %d
und mein Wert auf der Kommandozeile druckt er korrekt. Wenn ich das selbe von innen awk's BEGIN
Aussage, es verwirrt ihn. 🙂Drucken der richtigen Anzahl, mit der version von awk, die Teil des UWIN-system. Ich denke, es läuft darauf hinaus, die 'Qualität' der version der C-lib Funktionen verknüpft mit Ihrer version von awk. Auch haben Sie Zugriff auf eine 64-bit-Maschine und einer 64-bit-awk/gawk? Viel Glück.
Hmm leider Nein .. also im Grunde können wir nennen es ein bug ist, wie kann ich tun
printf %d
auf die CLI und es funktioniert. Es ist seltsam, dass selbst die GNU-version 4.0.0 von awk
reproduziert diese.Die interne printf-Befehl in neue(ish) KES als gefunden in einigen linux (Unbuntu unter anderem) und UWIN wird auch richtig sein, (genau wie die bash). Wie viel Daten sprechen Sie über die Verarbeitung? Und ist off-by-one auf einem 17digit Anzahl wirklich signifikant zu deinem problem?. (oh, das sieht nicht wie finanzielle Daten, so ist es wahrscheinlich signifikant 😉 ). Viel Glück.
InformationsquelleAutor jaypal singh | 2012-01-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Glaube ich, dass die zugrunde liegenden numerischen format in diesem Fall ist ein IEEE-double. So wird der geänderte Wert ist das Ergebnis von floating-point-precision-Fehler. Wenn es tatsächlich nötig ist, um zu behandeln, die großen Werte wie Numerik und zu pflegen genaue Präzision, ist es vielleicht besser, etwas zu verwenden, wie Perl, Ruby oder Python, die die Fähigkeit haben (vielleicht über Erweiterungen) zur Verarbeitung von beliebigen Genauigkeit rechnen.
printf
? Es ist nicht ein show-stopper für mich, sondern wollte einfach nur wissen, für LernzweckeIch glaube nicht, dass es möglich ist, eine Zahl darstellen, die in AWK exakt. Meinem Verständnis nach (kann falsch sein) ist, dass die awk immer verwendet mit doppelter Genauigkeit zu speichern numerischer Werte. So lange, wie Sie nicht brauchen, um mathematische Operationen durchgeführt, dann ist die beste Wette ist, um zu drucken/verwenden Sie als strings (die Sie schon herausgefunden).
Richtig. Nach
info gawk
: "Die interne Darstellung aller zahlen, einschließlich Ganzzahlen verwendet double-precision-floating-point-zahlen. Auf den meisten modernen Systemen, diese sind im IEEE-754-standard-format."InformationsquelleAutor Mark Wilkins
Beginnend mit GNU awk 4.1 können Sie
--bignum
oder-M
§ Command-Line Optionen
InformationsquelleAutor
UPDATE: Aktuelle Versionen von GNU-awk Unterstützung beliebiger Genauigkeit rechnen. Finden Sie die GNU awk-Benutzerhandbuch für mehr info.
ORIGINAL POST INHALT:
XMLgawk unterstützt beliebiger Genauigkeit arithmetische Operationen auf Gleitkomma-zahlen.
Also, wenn Sie die Installation xgawk ist eine option:
xgawk
als separates binary. Es empfiehltgawk
mitgawkextlib
. Und Ihre xgawk link ist tot. Ich war mir nicht sicher, welcher link wäre am besten, so dass ich nicht Bearbeiten Sie Ihre post selbst.Danke @PeterCordes, für den Hinweis it out! Poist aktualisiert.
InformationsquelleAutor Dimitre Radoulov
Dieser Antwort wurde teilweise beantwortet von @Mark Wilkins und @Dennis Williamson schon, aber ich fand heraus das größte 64-bit-Ganzzahl, die behandelt werden können, ohne an Präzision zu verlieren, ist 2^53.
Z.B. awk Referenz-Seite
http://www.gnu.org/software/gawk/manual/gawk.html#Integer-Programming
(sorry, wenn meine Antwort ist zu alt. Dachte, ich würde immer noch für die nächste person, bevor Sie verbringen zu viel Zeit auf dieser, wie ich es Tat)
InformationsquelleAutor 3150
Läuft bist du in Awk ' s Floating-Point-Darstellung-Probleme. Ich glaube nicht, dass Sie finden können ein work-around, innerhalb von awk-framework zum durchführen arithmetische Operationen auf großen zahlen genau.
Nur möglich (und grob) so kann ich mir vorstellen zu brechen, die große Zahl in kleinere Brocken, führen Sie Ihre Mathe-und kommen Sie wieder oder besser noch Perl/PHP/TCL/bsh etc scripting-Sprachen, die mächtiger sind als awk.
[jaypal:~/Temp] printf "%d" 19769904399993903 19769904399993903
InformationsquelleAutor anubhava
Mit nawk auf Solaris 11, die ich konvertieren Sie die Zahl in eine Zeichenfolge hinzufügen (verketten) eine null am Ende, und verwenden Sie dann
%15s
als format-string:InformationsquelleAutor Robert Deacle