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 :

calculer une liste de chiffres


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 68
    Points : 47
    Points
    47
    Par défaut calculer une liste de chiffres
    Bonjour,

    j'ai un fichiers de 100 lignes où il y a un chiffre sur chacune d'elle.

    Comment faire pour additionner tous ces chiffres ?

    avec expr ? ou autre ?

    merci

  2. #2
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    expr fera l'affaire.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 68
    Points : 47
    Points
    47
    Par défaut
    ok mais c'est la boucle que je n'arrive pas à visualiser pour addittionner chaque ligne

  4. #4
    Rédacteur
    Avatar de CedrX
    Inscrit en
    Avril 2007
    Messages
    1 111
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 111
    Points : 1 525
    Points
    1 525
    Par défaut
    Soit le fichier chiffres.txt contenant les lignes avec les chiffres, on va considérer d'ailleurs qu'il n'y a qu'un chiffre sur chaque ligne de ce fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #!/bin/bash
    valeur=0
    for i in `cat chiffres.txt` ; do
            valeur=`expr $valeur + $i`
    done
    echo $valeur

  5. #5
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Pour faire dans la diversité, voici une autre solution, ni meilleure ni plus mauvaise que celle de CedrX:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    valeur=0
    while read number
    do
        valeur=$(( $valeur + $number ))
    done < chiffres.txt
    echo $valeur
    Un problème bien posé est déjà résolu (H. Bergson).

  6. #6
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Citation Envoyé par jmelyn Voir le message
    Pour faire dans la diversité, voici une autre solution, ni meilleure ni plus mauvaise que celle de CedrX
    Elle est infiniment meilleure que celle de CedrX. Pas à cause du choix de $(( ... )) au lieu de expr, mais parce que celle de CedrX va merder si les lignes contiennent des espaces. Elle est aussi beaucoup plus gourmande en mémoire.

  7. #7
    Rédacteur
    Avatar de CedrX
    Inscrit en
    Avril 2007
    Messages
    1 111
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 111
    Points : 1 525
    Points
    1 525
    Par défaut
    Elle est infiniment meilleure que celle de CedrX.
    Infiniment c'est clair. Au moins ça ...

  8. #8
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Oui, je trouve ta méthode mauvaise. Désolé si je t'ai vexé mais une des solutions est meilleure que l'autre, et je pense qu'il fallait le signaler.

  9. #9
    Rédacteur
    Avatar de CedrX
    Inscrit en
    Avril 2007
    Messages
    1 111
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 111
    Points : 1 525
    Points
    1 525
    Par défaut
    Et je suis infiniment d'accord avec toi
    Effectivement elle est plus gourmande en mémoire. je concède.

    De là à dire qu'elle est infiniment plus mauvaise...
    Mais bon il y a des gens qui proposent des solutions et d'autres qui critiquent c'est bien connu

  10. #10
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Signaler qu'une solution est meilleure qu'une autre est une chose.
    Utiliser un superlatif tel que "infiniment" en est une autre.
    Il faut être précis et expliquer ses choix. Utiliser un superlatif disproportionné c'est exagérer et ça n'est pas être clair.

    Je suis également d'accord : autant éviter expr, en plus ça évite une dépendance et bash sait évaluer tout seul, donc autant en abuser.

    Merci à tous pour vos interventions constructives.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  11. #11
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Citation Envoyé par ggnore Voir le message
    Signaler qu'une solution est meilleure qu'une autre est une chose.
    Utiliser un superlatif tel que "infiniment" en est une autre.
    Il faut être précis et expliquer ses choix.
    C'est précisément ce que j'ai fait.
    Citation Envoyé par ggnore Voir le message
    Utiliser un superlatif disproportionné c'est exagérer et ça n'est pas être clair.

    Je suis également d'accord : autant éviter expr, en plus ça évite une dépendance et bash sait évaluer tout seul, donc autant en abuser.
    Le problème n'est pas le expr, c'est le "for i in ..." qui ne peut pas être utilisé si la ligne contient des espaces, et qui est aussi une moins bonne solution en termes de performance. Il n'y a aucune raison de préférer cette solution à l'autre ; "infiniment" me semble donc justifié.

    J'arrête avec ce thread avant de heurter trop de sensibilités...

  12. #12
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    Et cette méthode vous en pensez quoi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #!/bin/ksh
    valeur=0
    while read number
    do
        (( valeur += number ))
    done < chiffres.txt
    echo $valeur
    PS outre le fait que je ne suis pas certain que cette écriture soit possible en bash (que je n'utilise jamais), je ne me vexerais pas si on me dit que cette méthode est infiniment merdique

  13. #13
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Ben non c'est pas infiniment merdique, c'est très bien

    Ce qui me fait penser d'ailleurs que dans la solution de jmelyn, il vaut mieux faire $(( valeur + number )) plutôt que $(( $valeur + $number ))

  14. #14
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Le côté technique de ce fil est très intéressant, plein de bonnes choses à en retirer. Merci à tous les intervenants, même à Ohemeg qui a posé la question!

    Le côté jugement me semble superfétatoire car il risque d'embrouiller les lecteurs et choquer la personne visée. Nous sommes ici par plaisir et pour l'enrichissement mutuel. Chacun peut faire des erreurs (et je suis le premier), ne pas connaître certains aspects de la chose discutée, mais nul n'est tenu à la perfection, je crois. Tentons, essayons, changeons... à plusieurs le résultat est généralement meilleur que sorti d'une seule cervelle.

    Bon weekend à ceux qui quittent le clavier pour ces deux jours.
    Un problème bien posé est déjà résolu (H. Bergson).

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 68
    Points : 47
    Points
    47
    Par défaut
    Merci à tous pour votre participation actives et désolé d'avoir semé un peu de zizanie

    sinon que signifie les (( et ))

    merci

  16. #16
    Membre éclairé Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Points : 823
    Points
    823
    Par défaut
    Pour Bash, $(( 1 + 1 )) permet de faire des traitements arithmétiques plutôt qu'alphabétiques. Donc le résultat est 2. Cela correspond à `expr 1 + 1` ou $(expr 1 + 1).

    Pour Ksh il suffit de faire (( 1 + 1 )).
    Un problème bien posé est déjà résolu (H. Bergson).

  17. #17
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    si mes souvenir sont bons, pour ksh
    est strictement identique à

  18. #18
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 30
    Points : 33
    Points
    33
    Par défaut
    Citation Envoyé par ggnore Voir le message
    Il faut être précis et expliquer ses choix.
    ...
    Je suis également d'accord : autant éviter expr, en plus ça évite une dépendance et bash sait évaluer tout seul, donc autant en abuser.

    Merci à tous pour vos interventions constructives.
    J'ai une remarque "constructive". Moi je préfère utiliser expr parce que $(()) est un bashisme. C'est une construction qui vous oblige à exécuter votre script avec bash et non avec n'importe quel shell.

    Par exemple je viens de tester avec "ash", ça marche pas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Trouver une somme via une liste de chiffres
    Par Guignon dans le forum Général Python
    Réponses: 12
    Dernier message: 27/02/2015, 17h07
  2. Réponses: 29
    Dernier message: 29/03/2007, 11h50
  3. Réponses: 3
    Dernier message: 30/06/2006, 09h41
  4. calcul de valeurs présentes dans une liste de résultat
    Par Makaveli33 dans le forum Access
    Réponses: 8
    Dernier message: 15/05/2006, 19h03
  5. Choisir un chiffre aléatoire parmi une liste
    Par djsbens dans le forum Général Java
    Réponses: 2
    Dernier message: 08/03/2006, 18h19

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