10
votes

Impression de longs entiers à awk

J'ai un fichier d'alimentation délimité à pipe qui compte plusieurs champs. Comme j'en ai besoin que quelques-uns, j'ai pensé à utiliser awk code> pour les capturer à des fins de test. Cependant, j'ai remarqué que printf code> strong> modifie la valeur si j'utilise "% d" code> strong>. Cela fonctionne bien si j'utilise "% s" code> strong>.

Fichier d'alimentation Sample: h3>

[Jaypal: ~ / Temp] Cat Temp Code> strong> p>

302610004125074 | 1976990439074 | 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 | 0 | 0 | 0 | 30 | 0 | 0 | 250 | 0 | 7 | 0 | 0 | 0 | 0 | 0 | 0 | 10 | 54320058002 | 906 | 722310 | 2 | 0 | 0 | 0 | 0 | Bell Mobilité cellulaire, Inc | Bell Mobilité cellulaire, Inc | Bell Mobilité | Amx Argentine SA. | Claro Aka CTI MOVIL | | Arg | code> strong> p> BlockQuote>

Je suis intéressé à capturer la colonne SECOND CODE> STROND> QUI EST STROND> 19769904399993903 CODE> P >

Voici mes tests: h3> xxx pré>

Cependant, les deux tests suivants fonctionnent bien - P>

[jaypal:~/Temp] gawk --version
GNU Awk 4.0.0
Copyright (C) 1989, 1991-2011 Free Software Foundation.

[jaypal:~/Temp] awk --version
awk version 20070501


5 commentaires

Que se passe-t-il si vous utilisez printf "% 17.0f \ n" de AWK's Mon expérience avec AWK dit de poster cette question sur comp.lang.awk. Bonne chance!


Merci @shellter. J'ai obtenu le même résultat. Étonnamment, cela ne se produit qu'à l'intérieur de awk . Si je fais printf% d et ma valeur sur la ligne de commande, elle imprime correctement. Si je fais la même chose à l'intérieur Begwk's Begk's's's's's's's's's omettez-le, il le gâche. :)


Il imprimé le numéro correct avec la version de AWK qui fait partie du système UWIN. Je pense que cela se résume à la «qualité» de la version des fonctions C-LIB liées à votre version de AWK. Aussi avez-vous accès à une machine de 64 bits et à un awk / gawk 64 bits? Bonne chance.


Hmm Malheureusement, NO .. Donc, nous pouvons appeler cela un bug possible comme je peux faire printf% d sur la CLI et fonctionne. C'est étrange que même la version GNU 4.0.0 de AWK reproduit ceci.


La commande interne printf dans de nouveaux kshs (ish) tels que trouvés dans certains Linux (UNBUNTU entre autres) et Uwin sera également correct (tout comme Bash). Combien de données parlez-vous de traitement? Et est hors-tête sur un numéro 17Digit vraiment significatif pour votre problème? (Oh, cela ne ressemble pas à des données financières, il est donc probable que cela est probablement significatif ;-)). Bonne chance.


6 Réponses :


5
votes

Je crois que le format numérique sous-jacent dans ce cas est un double IEEE. Donc, la valeur modifiée est le résultat d'erreurs de précision de point flottant. S'il est effectivement nécessaire de traiter les grandes valeurs comme numérics et de maintenir une précision précise, il peut être préférable d'utiliser quelque chose comme Perl, Ruby ou Python qui ont les capacités (peut-être via des extensions) pour gérer l'arithmétique arbitraire de précision.


3 commentaires

Merci Mark, alors comment pouvons-nous gérer ces numéros avec printf ? Ce n'est pas un bouchon d'exposition pour moi, mais je voulais juste savoir à des fins d'apprentissage


Je ne pense pas qu'il soit possible de représenter un nombre à l'awk avec précision. Ma compréhension (qui peut être incorrecte) est que AWK utilise toujours une double précision pour stocker des valeurs numériques. Tant que vous n'avez pas besoin d'effectuer des opérations de mathématiques, le meilleur pari est de les imprimer / les utiliser comme chaînes (que vous avez déjà découvertes).


Correct. Selon Info GAWK : "La représentation interne de tous les numéros, y compris les nombres entiers, utilise des nombres à virgule flottante à double précision. Sur la plupart des systèmes modernes, ceux-ci sont au format standard IEEE 754."




4
votes

Mise à jour : versions récentes de la précision arbitraire de la précision arbitraire de GNU AWK. Voir le manuel GNU AWK pour plus d'informations.

Contenu de poste original: XMLGAWK prend en charge l'arithmétique de précision arbitraire sur les nombres à virgule flottante. Donc, si vous installez xgawk est une option: xxx


1 commentaires

Sourceforge.net/projects/gawkextlib/files/xgawk dit que GNU awk 4.1 obsolète xgawk comme un binaire distinct. Il recommande GAWK avec GawkextLib . Et votre lien xgawk est mort. Je n'étais pas sûr quel lien serait le meilleur, donc je n'ai pas édité votre publication moi-même.



4
votes

Cette réponse a déjà été traitée partiellement par @mark Wilkins et @dennis Williamson, mais j'ai découvert le plus grand nombre de 64 bits pouvant être traités sans perdre de précision est 2 ^ 53. Page de référence d'Awk par exemple http://www.gnu.org/software/gawk/manual /gawk.html#Integer-Programmer

(désolé si ma réponse est trop âgée. Vous avez compris que je partageais toujours la personne suivante avant de passer trop de temps à ce que je l'ai fait)


0 commentaires

12
votes

commençant par Gnu awk 4.1 Vous pouvez utiliser - Bignum ou -M xxx

§ Options de ligne de commande


0 commentaires

0
votes

Utilisation de Nawk sur Solaris 11, je convertis le numéro à une chaîne en ajoutant (concaténate) une null à la fin, puis utilisez % 15s code> comme chaîne de format:

printf("%15s\n", bignum "")   


0 commentaires