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 :

Bash script, erreur de calcul?


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 14
    Par défaut Bash script, erreur de calcul?
    Bonjour à tous,

    J'ai écris ce petit script bash qui doit transformer ce fichier nommé "result":

    & 10 & -4.4147079988E+01 & 4.6592513267E+00 & 7.3491923355E+00 \ \
    & 12 & -4.4150940635E+01 & 4.6592513267E+00 & 7.3525388258E+00 \ \
    & 14 & -4.4151624528E+01 & 4.6594378193E+00 & 7.3495800950E+00 \ \
    & 16 & -4.4151715874E+01 & 4.6592457860E+00 & 7.3491923355E+00 \ \
    & 18 & -4.4152277518E+01 & 4.6579270685E+00 & 7.3486018485E+00 \ \
    & 20 & -4.4152935484E+01 & 4.6582915896E+00 & 7.3484648209E+00 \ \
    & 24 & -4.4153569333E+01 & 4.6585501990E+00 & 7.3478948665E+00 \ \
    & 28 & -4.4153664604E+01 & 4.6587170762E+00 & 7.3483576215E+00 \ \


    en ce fichier nommé "result.out" :

    & 10 & -22.07353995 & 4.6592513267 & 7.3491923355 \\
    & 12 & -22.07433395 & 4.6592513267 & 7.3525388258 \\
    & 14 & -22.07353995 & 4.6594378193 & 7.3495800950 \\
    & 16 & -22.07344995 & 4.6592457860 & 7.3491923355 \\
    & 18 & -22.07333995 & 4.6579270685 & 7.3486018485 \\
    & 20 & -22.06777775 & 4.6582915896 & 7.3484648209 \\
    & 24 & -22.04563995 & 4.6585501990 & 7.3478948665 \\
    & 28 & -22.07353995 & 4.6587170762 & 7.3483576215 \\

    Il faut en gros diviser la deuxième colonne par 2 et effectuer quelques opération de mise en forme pour mettre facilement en latex par la suite.

    Le problème est que pour le moment mon code me donne:

    & 10 & -3.914707999 & 4.6592513267 & 7.3525388258 \\
    & 12 & -3.915094064 & 4.6592513267 & 7.3525388258 \\
    & 14 & -3.915162453 & 4.6594378193 & 7.3495800950 \\
    & 16 & -3.915171587 & 4.6592457860 & 7.3491923355 \\
    & 18 & -3.915227752 & 4.6579270685 & 7.3486018485 \\
    & 20 & -3.915293548 & 4.6582915896 & 7.3484648209 \\
    & 24 & -3.915356933 & 4.6585501990 & 7.3478948665 \\
    & 28 & -3.915366460 & 4.6587170762 & 7.3483576215 \\

    Il divise donc mal par 2 ???

    Mon code est le suivant :

    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
     
    #!/bin/bash
     
    #set -x
    while read n1 n2 n5 val1 n6 val2 n7 val3
     do
       printf " & "
       printf "%'.0f " $n2
       printf " & "
       val1=$(echo "scale=9; $val1 / 2" | bc)
       printf "%'.9f " $val1
       printf " & "
       printf "%'.10f " $val2
       printf " & "
       printf "%'.10f " $val3
       printf " \\"
       printf "\\"
       printf " \n"
    done < result > result.out
    D'avance merci pour vos réponses.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 662
    Par défaut
    Bonjour Tanakaa,

    ripat a posté une solution en awk sur ton précédent fil, qui donne, une fois adapté, le résultat que tu attends...

    Mais je suis également curieux de comprendre les raisons d'un tel comportement de la part de bc
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 14
    Par défaut
    Merci pour ta réponse N_BaH

    Je précise d'emblée que je suis assez débutant en bash/shell mais il me semble que awk traite les données en colonne et donc comme je suis dans une boucle while qui traite chaque donnée ligne par ligne ça ne marche pas (j'ai essayé)

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 662
    Par défaut
    si, si... tu envoies (l'élément de) la ligne à awk dans une 'chaîne en ligne' (herestring)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while read n1 n2 n5 val1 n6 val2 n7 val3; do
       # tes commandes
       val1=$(awk 'commandes' <<<$val1)
       # tes commandes (suite)
    done
    ...
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 14
    Par défaut
    ça a pas l'air de fonctionner?

    Avec le code suivant:

    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
    #!/bin/bash
     
    while read n1 n2 n5 val1 n6 val2 n7 val3
     do
       printf " & "
       printf "%'.0f " $n2
       printf " & "
       val1=$(awk 'scale=9; $val1*0.5' <<<$val1)
       printf "%'.9f " $val1
       printf " & "
       printf "%'.10f " $val2
       printf " & "
       printf "%'.10f " $val3
       printf " \\"
       printf "\\"
       printf " \n"
    done < result > result.out
    J'obtiens:

    & 10 & -44.147079988 -44.147079988 & 4.6592513267 & 7.3525388258 \\
    & 12 & -44.150940635 -44.150940635 & 4.6592513267 & 7.3525388258 \\
    & 14 & -44.151624528 -44.151624528 & 4.6594378193 & 7.3495800950 \\
    & 16 & -44.151715874 -44.151715874 & 4.6592457860 & 7.3491923355 \\
    & 18 & -44.152277518 -44.152277518 & 4.6579270685 & 7.3486018485 \\
    & 20 & -44.152935484 -44.152935484 & 4.6582915896 & 7.3484648209 \\
    & 24 & -44.153569333 -44.153569333 & 4.6585501990 & 7.3478948665 \\
    & 28 & -44.153664604 -44.153664604 & 4.6587170762 & 7.3483576215 \\

    Et avec le code suivant:

    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
    #!/bin/bash
     
    while read n1 n2 n5 val1 n6 val2 n7 val3
     do
       printf " & "
       printf "%'.0f " $n2
       printf " & "
       val1=$(awk ' $val1*0.5 ' <<<$val1)
       printf "%'.9f " $val1
       printf " & "
       printf "%'.10f " $val2
       printf " & "
       printf "%'.10f " $val3
       printf " \\"
       printf "\\"
       printf " \n"
    done < result > result.out
    J'obtiens le bon fichier output mais sans la division par 2.

    & 10 & -44.147079988 & 4.6592513267 & 7.3525388258 \\
    & 12 & -44.150940635 & 4.6592513267 & 7.3525388258 \\
    & 14 & -44.151624528 & 4.6594378193 & 7.3495800950 \\
    & 16 & -44.151715874 & 4.6592457860 & 7.3491923355 \\
    & 18 & -44.152277518 & 4.6579270685 & 7.3486018485 \\
    & 20 & -44.152935484 & 4.6582915896 & 7.3484648209 \\
    & 24 & -44.153569333 & 4.6585501990 & 7.3478948665 \\
    & 28 & -44.153664604 & 4.6587170762 & 7.3483576215 \\

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 662
    Par défaut
    ah, oui...mais non : tu dois adapter les commandes awk données par ripat dans le lien vers ton précédent fil !!!
    ...sachant que tu n'as plus qu'un seul champs, puisque tu donnes à awk la valeur à calculer.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 14
    Par défaut
    J'ai finalement réussi à le faire fonctionner avec le code ci-dessous \o/ en utilisant ce qu'avait dis ripat (merci à lui également).

    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
    #!/bin/bash
     
    while read n1 n2 n5 val1 n6 val2 n7 val3
     do
       printf " & "
       printf "%'.0f " $n2
       printf " & "
       val1=$(awk '{$1=sprintf("%1.11f", $1/2)}1' <<<$val1)
       printf "%'.9f " $val1
       printf " & "
       printf "%'.10f " $val2
       printf " & "
       printf "%'.10f " $val3
       printf " \\"
       printf "\\"
       printf " \n"
    done < result > result.out
    Reste que je comprends pas pourquoi mes codes précédent ne fonctionnaient pas et surtout je n'arrive vraiment pas à comprendre comment marche bc. Il revoit vraiment des résultat super bizarre?

Discussions similaires

  1. Probleme avec mon bash script
    Par spynux dans le forum Linux
    Réponses: 1
    Dernier message: 30/03/2006, 09h21
  2. [Tableaux] erreur de calcul
    Par dleu dans le forum Langage
    Réponses: 18
    Dernier message: 08/12/2005, 13h28
  3. erreur sur calcul
    Par Sendo dans le forum Access
    Réponses: 2
    Dernier message: 29/09/2005, 09h46
  4. Rotation erreur de calcul
    Par Speed41 dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 09/03/2005, 16h55
  5. C++Builder fait une erreur de calcul
    Par gandf dans le forum C++Builder
    Réponses: 7
    Dernier message: 03/01/2004, 22h27

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