IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Résultat de calcul bizarre avec awk


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut Résultat de calcul bizarre avec awk
    Bonjour,

    quand je fais du /var/ | tail -1 | awk '{print $1}' ça me donne 2123344 kb.
    Si je "descends" aux bytes en multipliant par 1024, la calculatrice me donne 2174304256 mais awk est moins lisible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ du /var/ | tail -1 | awk '{print $1 * 1024}'
    2.1743e+09
    Je me suis rendu compte que ça pourrait être mieux avec printf :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ du /var/ | tail -1 | awk '{printf"%d\n", $1}'
    2123344
    $ du /var/ | tail -1 | awk '{printf"%d\n", $1 * 1000}' # pour tester la sortie
    2123344000
    $ du /var/ | tail -1 | awk '{printf"%d\n", $1 * 1024}' # calcul faux !
    2147483647
    Je résume :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    une calculatrice me donne 2 174 304 256
    la formule scriptée donne 2 147 483 647
    Une idée du gag et de la solution ?
    Merci,

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    Perso, j'obtiens (GNU Awk 4.0.2) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo 2123344 | awk '{printf"%d\n", $1 * 1024}'
    2174304256

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    pareil.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ bc <<<"$(du -s /var | cut -f1)*1024"; du -s /var | awk '{print $1*1024}'                                                                                                                                                                                                                                     
    2808639488                                                                                                                                                                                                                                     
    2808639488
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    readlink -f $(which -a awk)
    /usr/bin/gawk
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    pareil.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ bc <<<"$(du -s /var | cut -f1)*1024"; du -s /var | awk '{print $1*1024}'                                                                                                                                                                                                                                     
    2808639488                                                                                                                                                                                                                                     
    2808639488
    Pas mal la première manière,

    La première, parce qu'un programme buggé, j'aime autant éviter :
    Citation Envoyé par N_BaH Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    readlink -f $(which -a awk)
    /usr/bin/gawk
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ readlink -f $(which -a awk)
    /usr/bin/mawk
    /usr/bin/mawk
    Pourquoi 2 fois la même ligne ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ ls -AlGg /usr/bin/maw*
    -rwxr-xr-x 1 121976 mars  23  2012 /usr/bin/mawk*

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    moi, je veux bien voir un:
    Juste pour savoir si c'est du 32 ou 64 bits

  6. #6
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    moi, je veux bien voir un:
    Juste pour savoir si c'est du 32 ou 64 bits
    32 dans la vieille machine,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /usr/bin/mawk: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0x3281b9b62bdfbafe3f1fc5ac374293271c76e1aa, stripped
    et 64 dans la toute neuve :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /usr/bin/mawk: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=1e84b07571ac879b843266c79c5c2c05626f5e7e, stripped

  7. #7
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Et moi qui me traîne sous Debian, j'ai la même depuis au moins presque 8 ans, la mawk 1.3.3, qui me donne (copier/coller de ton exemple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo 2123344 | awk '{printf"%d\n", $1 * 1024}'
    2147483647
    et cette valeur c'est le max d'un longint (2^31 -1) -- c't'un bug, quoi...

    Testé sur 2 machines, une de 8 ans d'âge et l'autre toute neuve, résultats (foireux) identiques.

    Bon, je contourne avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/bash
    varsize=$(du /var/ | tail -1 | awk '{printf "%d", $1}')
    echo $(($varsize*1024))

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    Peut-être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ echo "2123344" | awk '{printf"%ld\n", $1 * 1024}'

  9. #9
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Peut-être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ echo "2123344" | awk '{printf"%ld\n", $1 * 1024}'
    Bah nan, pas chez moi !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ varsize=$(du -s /var | awk '{printf "%d", $1}'); echo $varsize
    2123360
    $ varsize=$(du -s /var | awk '{printf "%d", $1 * 1024}'); echo $varsize
    2147483647
    $ varsize=$(du -s /var | awk '{printf "%ld", $1 * 1024}'); echo $varsize
    2147483647
    $ varsize=$(du -s /var | awk '{printf "%ld", $1 * 1000}'); echo $varsize
    2123360000
    Un bug, j'vous dis !

  10. #10
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Un bug, j'vous dis !
    La preuve de l'overflow :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    $ varsize=$(du -s /var | awk '{printf "%ld", $1 * 1000}'); echo $varsize
    2123360000 #*ok
    $ varsize=$(du -s /var | awk '{printf "%ld", $1 * 1010}'); echo $varsize
    2144593600 # ok
    $ varsize=$(du -s /var | awk '{printf "%ld", $1 * 1020}'); echo $varsize
    2147483647 # overflow
    $ varsize=$(du -s /var | awk '{printf "%ld", $1 * 1019}'); echo $varsize
    2147483647 # overflow
    $ varsize=$(du -s /var | awk '{printf "%ld", $1 * 1016}'); echo $varsize
    2147483647 # overflow
    $ varsize=$(du -s /var | awk '{printf "%ld", $1 * 1012}'); echo $varsize
    2147483647 # overflow
    $ varsize=$(du -s /var | awk '{printf "%ld", $1 * 1011}'); echo $varsize
    2146716960 # ok
    $ varsize=$(du -s /var | awk '{printf "%ld", ($1-1000000) * 1011}'); echo $varsize
    1135716960 # ok
    $ varsize=$(du -s /var | awk '{printf "%ld", ($1-1000000) * 1012}'); echo $varsize
    1136840320 # ok
    $ varsize=$(du -s /var | awk '{printf "%ld", ($1-1000000) * 1014}'); echo $varsize
    1139087040 # ok
    $ varsize=$(du -s /var | awk '{printf "%ld", ($1-1000000) * 1024}'); echo $varsize
    1150320640 # ok

  11. #11
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 349
    Par défaut
    Ok, dans ce cas, passe par un float qui est plus grand que l'entier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    varsize=$(du -s /var | awk '{printf "%.0f", $1 * 1000}'); echo $varsize

  12. #12
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Bonjour

    Citation Envoyé par Jipété Voir le message
    Bon, je contourne avec
    Non ! Tu contournes avec bc, qui est le seul, de tous les programmes cités, conçu pour faire du calcul.

  13. #13
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 127
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 127
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Non ! Tu contournes avec bc, qui est le seul, de tous les programmes cités, conçu pour faire du calcul.
    Adjugé vendu ! Et .

    Merci à tous,

    EDIT : étant entendu qu'on peut le faire également en Bash pur, varsize=$(($(du -s /var | cut -f1)*1024)); echo $varsize, à condition de ne pas penser à la fusée Ariane de triste mémoire... /EDIT

Discussions similaires

  1. Afficher un résultat de calcul avec setText
    Par Félinx dans le forum Débuter
    Réponses: 6
    Dernier message: 08/10/2014, 19h27
  2. résultats bizarre avec actualiser
    Par Lionel_aw dans le forum jQuery
    Réponses: 4
    Dernier message: 01/03/2011, 16h18
  3. [VxiR2] Problème avec résultat de calcul sur 2 requêtes liées.
    Par mouchou77 dans le forum Deski
    Réponses: 8
    Dernier message: 27/09/2010, 17h37
  4. Résultat bizarre avec JConsole
    Par riadhhwajdii dans le forum Général Java
    Réponses: 0
    Dernier message: 19/04/2010, 10h28
  5. résultat bizarre avec append
    Par saryry dans le forum jQuery
    Réponses: 2
    Dernier message: 19/07/2009, 11h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo