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 Je suis intéressé à capturer la colonne Cependant, les deux tests suivants fonctionnent bien - P> 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>
SECOND CODE> STROND> QUI EST STROND>
19769904399993903 CODE> P >
Voici mes tests: h3>
[jaypal:~/Temp] gawk --version
GNU Awk 4.0.0
Copyright (C) 1989, 1991-2011 Free Software Foundation.
[jaypal:~/Temp] awk --version
awk version 20070501
6 Réponses :
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. p>
Merci Mark, alors comment pouvons-nous gérer ces numéros avec printf code>? 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 CODE>: "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."
Merci Anubhava. Cela ressemble à droite, coz quand je le fais à la ligne de commande, il l'imprime bien [jaypal: ~ / temp] printf "% d" 19769904399993903 19769904399993903 CODE>
Contenu de poste original: strong>
XMLGAWK prend en charge l'arithmétique de précision arbitraire sur les nombres à virgule flottante.
Donc, si vous installez xgawk em> est une option: p>
Sourceforge.net/projects/gawkextlib/files/xgawk dit que GNU awk 4.1 obsolète xgawk code> comme un binaire distinct. Il recommande
GAWK code> avec
GawkextLib code>. 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.
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 p>
(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) P>
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 "")
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 code>. Si je fais
printf% d code> 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 code> sur la CLI et fonctionne. C'est étrange que même la version GNU 4.0.0 de
AWK code> 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.