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 le produit des valeurs d'une colonne


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Février 2011
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2011
    Messages : 176
    Par défaut Calculer le produit des valeurs d'une colonne
    Bonjour,
    je veux calculer le produit des données d'une colonne dans un fichier texte , le format de chaque ligne est le suivant :
    P( ..... ) = 0.000802232 logprob = -3.095700 bo_case = 1
    P(... ) = 0.25787 logprob = -0.588600 bo_case = 2
    P( ...) = 0.000287343 logprob = -3.541600 bo_case = 3-2
    P( ... ) = 0.0414477 logprob = -1.382500 bo_case = 3
    P(... ) = 0.0880846 logprob = -1.055100 bo_case = 3
    je veux calculer le produit de toute les valeurs des lignes se trouvant entre = et logprob
    et retourner à chaque fois le nom de fichier suivi de ce produit.

    J'ai commencé par extraire cette valeur et la mettre dans un fichier résultat mais ça donne un fichier résultat vide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for fic in *.txt 
    do 
    while read ligne
    do       
           val=$(echo "$ligne" | cut -d"=" -f2 | cut -d" " -f1)
           echo "$fich $val" > resultat.txt  
    done < $fic
    done
    merci d'avance

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    tu peux confirmer, s'il te plaît, que tu veux le produit, et non la somme ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Février 2011
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2011
    Messages : 176
    Par défaut
    Oui le produit, mais je vois que vu que la première colonne va donner presque des 0,
    le produit ou la somme me donne même chose en terme d'information

  4. #4
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    utilises DC pour faire ça c'est très simple

    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ dc
    3 4 * p
    12
    q
    $
    suffit donc d'afficher un echo du calcul à faire un pipe dans DC pour que ça marche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $ cd /tmp/d
    $ cat > /tmp/toto                                                       
    P( ..... ) = 0.000802232 logprob = -3.095700 bo_case = 1
    P(... ) = 0.25787 logprob = -0.588600 bo_case = 2
    P( ...) = 0.000287343 logprob = -3.541600 bo_case = 3-2
    P( ... ) = 0.0414477 logprob = -1.382500 bo_case = 3
    P(... ) = 0.0880846 logprob = -1.055100 bo_case = 3
     
    $ echo '32k 1 '$(sed 's/.*=\(.*\)logprob.*/\1*/' /tmp/toto ) 'pq' | dc  
    .00000000021702104269483793366184
    $
    le 32k au début est la précision demandée, là j'ai mis 32, mais tu peux utiliser le nombre de décimales que tu veux bien sur.

    1 est le premier chiffre pour empêcher d'avoir un stack vide au début du calcul, puisque DC travail en mode de calcul RPN. L'avantage de cette méthode c'est que tous les unix ont DC

    la sous commande sed sert à sélectionner la colonne qui nous intéresse...
    c'est donc comme si on tapait à la main ceci dans DC
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     32k 1  0.000802232 * 0.25787 * 0.000287343 * 0.0414477 * 0.0880846 * pq
    Quand on a plusieurs fichiers de calculs à traiter il suffit de générer le texte complet de l’opération totale dans un fichier et de faire interpréter ce dernier par DC
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
             $ cp /tmp/toto /tmp/tutu                                                                                                                                                               
    $ cp /tmp/toto /tmp/titi
    $ echo '32k 1 ' > /tmp/operation ; for i in /tmp/t?t? ; do echo $(sed 's/.*=\(.*\)logprob.*/\1*/' $i ) >> /tmp/operation ; done ; echo 'pq' >> /tmp/operation ; cat /tmp/operation     
    32k 1 
    0.000802232 * 0.25787 * 0.000287343 * 0.0414477 * 0.0880846 *
    0.000802232 * 0.25787 * 0.000287343 * 0.0414477 * 0.0880846 *
    0.000802232 * 0.25787 * 0.000287343 * 0.0414477 * 0.0880846 *
    pq
    on voit bien que l'opération est bien complête avec les 3 fichiers /tmp/toto /tmp/titi et /tmp/tutu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $ echo '32k 1 ' > /tmp/operation ; for i in /tmp/t?t? ; do echo $(sed 's/.*=\(.*\)logprob.*/\1*/' $i ) >> /tmp/operation ; done ; echo 'pq' >> /tmp/operation ; cat /tmp/operation | dc
    .00000000000000000000000000001022
    $
    le calcul est bien bon puisqu'on a bien le résultat attendu.

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Février 2011
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2011
    Messages : 176
    Par défaut
    j'ai aussi ce message d'eureur :
    dc: 't' (0164) unimplemented
    dc: 't' (0164) unimplemented
    .310456
    dc: output base must be a number greater than 1
    dc: 'b' (0142) unimplemented
    dc: value overflows simple integer; punting...
    dc: �'g' (0147) unimplemented
    dc: stack empty
    dc: 't' (0164) unimplemented
    dc: 't' (0164) unimplemented
    0
    j'ai mis le même code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for fic in *.txt 
    do
      echo '32k 1 '$(sed 's/.*=\(.*\)logprob.*/\1*/' $fic ) 'pq' | dc
      #val=$( { { echo 'scale=20;' ; cat $fic ; } | sed -e 's|.*= *\(.*\) logprob.*|\1 *|' | tr '\n' ' ' ; echo '1' ; } | bc -l)
      #echo "$fich $val" 
    done
    je pense qu'il vaut mieux calculer la somme, ça donne même information comme valeur
    Si je fait la somme c'est comment ?

  6. #6
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    oui j'ai oublié de préciser qu'il faut lancer ça depuis un repertoire vide à cause de sed qui risque d'interpreter le caractère "*" au lieu de l'utiliser comme caractère.


  7. #7
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ echo '32k 1 ' > /tmp/operation ; for i in /tmp/t?t? ; do echo $(sed 's/.*=\(.*\)logprob.*/\1+/' $i ) >> /tmp/operation ; done ; echo 'pq' >> /tmp/operation ; cat /tmp/operation     
    32k 1 
    0.000802232 + 0.25787 + 0.000287343 + 0.0414477 + 0.0880846 +
    0.000802232 + 0.25787 + 0.000287343 + 0.0414477 + 0.0880846 +
    0.000802232 + 0.25787 + 0.000287343 + 0.0414477 + 0.0880846 +
    pq
    $ echo '32k 1 ' > /tmp/operation ; for i in /tmp/t?t? ; do echo $(sed 's/.*=\(.*\)logprob.*/\1+/' $i ) >> /tmp/operation ; done ; echo 'pq' >> /tmp/operation ; cat /tmp/operation | dc
    2.165475625
    $
    pour la somme c'est pareil avec un "+"

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Quelque chose comme ça?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for fic in *.txt ; do
      val=$( { { echo 'scale=20;' ; cat $fic ; } | sed -e 's|.*= *\(.*\) logprob.*|\1 *|' | tr '\n' ' ' ; echo '1' ; } | bc -l)
      echo "$fich $val"
    done
    Avec le fichier fourni en exemple, on obtient:
    .00000000021702104269

    )jack(

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

Discussions similaires

  1. Décalage des valeurs d'une colonne
    Par Niazov dans le forum SAS Base
    Réponses: 8
    Dernier message: 09/07/2008, 17h28
  2. insertion des valeurs dans une colonne
    Par freestyler1982 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 24/01/2007, 16h38
  3. Maximum des valeurs d'une colonne
    Par cjacquel dans le forum Access
    Réponses: 1
    Dernier message: 19/01/2007, 17h25
  4. Réponses: 2
    Dernier message: 11/07/2006, 12h02
  5. quote dans des valeurs d'une colonne SET
    Par Jean Fi dans le forum Requêtes
    Réponses: 6
    Dernier message: 30/03/2006, 20h16

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