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 :

Gérer les nombres réels pour script shell


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 27
    Points : 18
    Points
    18
    Par défaut Gérer les nombres réels pour script shell
    Bonjour ,

    Je souhaite comparer deux réels à chaque tour de la boucle "while".
    Cependant , j'ai un problème de syntaxe pour gérer les réels.
    Je sais que cela se fait avec la commande "bc".
    Je code rarement des scripts bash donc cela serait sympa de développer un peu vos réponses s'il vous plait.


    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
    23
     
    #!/bin/bash
     
    pval=( 10^-6 10^-5 10^-4 10^-3 ) 
    li=( 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 )
    lr=( -0.1 -0.2 -0.3 -0.4 -0.5 -0.6 -0.7 -0.8 -0.9 -1.0 -1.1 -1.2 -1.3 -1.4 -1.5 -1.6 )
     
    i=0
    j=0
     
    for k in "${pval[@]}"; do
     
        while [ ("${li[i]}"| bc) -ne ("${li[16]}"| bc) ] && [ ("${lr[j]}"| bc) -ne ("${lr[16]}"| bc) ]
        do 
               #./Select.R ${li[i]} ${lr[j]} $k
               echo  ${li[i]} ${lr[j]} $k
               i=$(($i+1))
               j=$(($j+1))
        done
    i=0
    j=0
     
    done
    Cela bloque aussi au niveau des "done". Je pense que la réinitialisation de i et de j pose problème.

    Merci

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 27
    Points : 18
    Points
    18
    Par défaut
    Bon voilà une autre tete du script.
    Cela devrait aider comprendre ce que je tente de faire.
    Au cas ou vous auriez des remarques pour l'améliorer .

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    #!/bin/bash
     
    pval=( 10^-6 10^-5 10^-4 10^-3 ) 
    li=( 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 )
    lr=( -0.1 -0.2 -0.3 -0.4 -0.5 -0.6 -0.7 -0.8 -0.9 -1.0 -1.1 -1.2 -1.3 -1.4 -1.5 -1.6 )
     
    name="Histogramme_Sélection_"
    n_file="Hist_pval_"
    o_file="Data_FC_"
    p_file="Data_pval_"
    ext=".pdf"
     
    i=0
    j=0
     
    for k in "${pval[@]}"; do
     
        while [ ("${li[i]}"| bc) -ne ("${li[16]}"| bc) ] && [ ("${lr[j]}"| bc) -ne ("${lr[16]}"| bc) ]
        do 
               #./Select.R ${li[i]} ${lr[j]} $k
               echo  ${li[i]} ${lr[j]} $k
     
               #f="$o_file${li[i]}_${lr[j]}"
               #mkdir $f
               #mv *.xls $f
     
               #mv "$Histogramme_Sélection.pdf" "$name$[i]$ext" 
     
               i=$(($i+1))
               j=$(($j+1))
        done
     
        #f1="$p_file$[k]"
        #mkdir $f1
        #mv *$o_file* $f1
     
        #fichier="$n_file$[k]"
        #mkdir $fichier
        #mv *.pdf $fichier
        i=0
        j=0
    done

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    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 102
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par Bil'0x Voir le message
    Cela bloque aussi au niveau des "done". Je pense que la réinitialisation de i et de j pose problème.
    Cela bloque? Si tu nous donnais le message précis, ce serait plus facile pour te répondre!

    Il y a quelques pb dans ton script. En voici quelques uns:

    Pour accéder au i-ème élément d'un tableau li, il faut "évaluer" i, soit "${li[${i}]}" et non "${li[i]}":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ li=( 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 )
    $ echo "${li[${i}]}"
    0.1
    Je ne comprends pas le sens de comparer le i-ème élément du tableau avec le 16ème ???

    Pour effectuer une comparaison avec bc, il suffit de faire (dans le meilleur des cas):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ echo '3 < 5' | bc
    1
    $ echo '3 > 5' | bc
    0
    et pour tester cette comparaison:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a=3; b=5; if [ $(echo "${a} < ${b}" | bc) -eq 1 ]; then echo 'a < b'; fi
    Attention à la logique de 'bc' (1 = oui ; 0 = non) qui est différente des codes de retour shell (0 = ok; 1 = ko).

    Essaie déjà d'intégrer ces remarques dans ton script!

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 104
    Points : 28 392
    Points
    28 392
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a=3; b=5; if [ $(echo "${a} < ${b}" | bc) -eq 1 ]; then echo 'a < b'; fi
    Attention à la logique de 'bc' (1 = oui ; 0 = non) qui est différente des codes de retour shell (0 = ok; 1 = ko).
    On peut d'ailleurs se servir de cela pour "simplifier" l'écriture du test en utilisant l'évaluation arithmétique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a=3; b=5; if (( $(echo "${a} < ${b}" | bc) )); then echo 'a < b'; fi

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 27
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Je ne comprends pas le sens de comparer le i-ème élément du tableau avec le 16ème ???
    Aucun
    En faite mon problème à été résolu depuis assez longtemps en fait.

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    #!/bin/bash
     
    pval=( 10^-6 10^-5 10^-4 10^-3 ) 
    li=( 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 )
    lr=( -0.1 -0.2 -0.3 -0.4 -0.5 -0.6 -0.7 -0.8 -0.9 -1.0 -1.1 -1.2 -1.3 -1.4 -1.5 -1.6 )
     
    name="Histogramme_Sélection"
    n_file="Hist_pval_"
    o_file="Data_FC_"
    p_file="Data_pval_"
    ext=".pdf"
    i=0
     
    for k in "${pval[@]}"; do
     
        while [ "${li[${i}]}" ] && [ "${lr[${i}]}" ]
        do 
               ./Select.R ${li[${i}]} ${lr[${i}]} $k
     
               f="$o_file${li[${i}]}_${lr[${i}]}"
               mkdir $f
               mv *.xls $f
     
               mv "$name$ext" "$name$[i]$ext" 
     
               i=$(($i+1))
        done
     
        f1="$p_file$k"
        mkdir $f1
        mv *$o_file* $f1
     
        fichier="$n_file$k"
        mkdir $fichier
        mv *.pdf $fichier
        i=0
    done
    Cependant , j'ai quand même écris une solution au cas ou quelqu'un passerait par là
    Il va comparer la i-ème valeur réel du tableau à une autre valeur réel de position fixe.

    Visiblement aucun intérêt vis-à-vis de mon problème !

    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
    23
    24
    25
    26
    27
    28
    29
    30
     
    #!/bin/bash
    set -xv
    pval=( 10^-6 10^-5 10^-4 10^-3 ) 
    li=( 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 )
    lr=( -0.1 -0.2 -0.3 -0.4 -0.5 -0.6 -0.7 -0.8 -0.9 -1.0 -1.1 -1.2 -1.3 -1.4 -1.5 -1.6 ) 
     
    i=0
    j=0 
    f1=0
    f2=0
     
    for k in "${pval[@]}"; do
     
        while [ "${li[${i}]}" ] && [ "${lr[${i}]}" ]
        do
               if [ $( "${li[${i}]} < ${li[${8}]}" | bc ) -eq 1 ]; then f1=1; fi
               if [ $( "${lr[${j}]} > ${lr[${8}]}" | bc ) -eq 1 ]; then f2=1; fi
     
               if [ $f1-eq 1] && [ $f2 -eq 1]; then echo ${li[${i}]} ${lr[${j}]} $k; fi 
     
               i=$(($i+1))
               j=$(($j+1))
     
               f1=0
               f2=0
        done
        i=0
        j=0
    done
    Erreurs:
    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
    23
    24
    25
     
    bash: 1.2 > 0.1 : commande introuvable
    ++ bc
    + '[' -eq 1 ']'
    bash: [: -eq : opérateur unaire attendu
     "${lr[${j}]} < ${lr[${8}]}" | bc )
     "${lr[${j}]} < ${lr[${8}]}" | bc )
     "${lr[${j}]} < ${lr[${8}]}" | bc 
    ++ '-1.2 < -0.1'
    bash: -1.2 < -0.1 : commande introuvable
    ++ bc
    + '[' -eq 1 ']'
    bash: [: -eq : opérateur unaire attendu
    + '[' 0-eq '1]'
    bash: [: « ] » manquant
    + i=12
    + j=12
    + f1=0
    + f2=0
    + '[' 1.3 ']'
    + '[' -1.3 ']'
     "${li[${i}]} > ${li[${8}]}" | bc )
     "${li[${i}]} > ${li[${8}]}" | bc )
     "${li[${i}]} > ${li[${8}]}" | bc 
    ++ '1.3 > 0.1'

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 27
    Points : 18
    Points
    18
    Par défaut
    Bon je viens de m'apercevoir que les données en puissance 10 comme 10^-6 etc..
    ne sont pas les bons .
    Mon script R me génère des données érronées.

    Script bash
    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
    23
     
    #!/bin/bash
     
    pval=( 10^-6 10^-5 10^-4 10^-3 ) 
    li=( 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 )
    lr=( -0.1 -0.2 -0.3 -0.4 -0.5 -0.6 -0.7 -0.8 -0.9 -1.0 -1.1 -1.2 -1.3 -1.4 -1.5 -1.6 )
     
    name="Histogramme_Sélection"
    n_file="Hist_pval_"
    o_file="Data_FC_"
    p_file="Data_pval_"
    ext=".pdf"
    i=0
     
    for k in "${pval[@]}"; do
     
        while [ "${li[${i}]}" ] && [ "${lr[${i}]}" ]
        do 
               ./test.R ${li[${i}]} ${lr[${i}]} $k
               i=$(($i+1))
        done
        i=0
    done
    script R de test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #!/usr/bin/env Rscript 
     
    # Réccupération des arguments 
    args<-commandArgs(TRUE)
     
    # Réccupération des paramètres
    valFcind<-as.numeric(args[1])
    valFcrep<-as.numeric(args[2])
    pValue<-as.numeric(args[3])
     
    print(valFcind)
    print(valFcrep)
    print(pValue)
    Erreurs :

    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
     
    Warning message:
    NAs introduced by coercion 
    [1] 1.2
    [1] -1.2
    [1] NA
    Warning message:
    NAs introduced by coercion 
    [1] 1.3
    [1] -1.3
    [1] NA
    Warning message:
    NAs introduced by coercion 
    [1] 1.4
    [1] -1.4
    [1] NA
    Warning message:
    NAs introduced by coercion 
    [1] 1.5
    [1] -1.5
    [1] NA
    On voit bien que le problème vient des valeurs du tableau pval qui ne sont pas correctement pris en compte.
    Quelqu'un ?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 27
    Points : 18
    Points
    18
    Par défaut
    La meilleur solution est de l'écrire sous cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    pval=( 0.000001 0.00001 0.0001 0.001 ) 
    li=( 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 1.1 1.2 1.3 1.4 1.5 1.6 )
    lr=( -0.1 -0.2 -0.3 -0.4 -0.5 -0.6 -0.7 -0.8 -0.9 -1.0 -1.1 -1.2 -1.3 -1.4 -1.5 -1.6 )
    Et ça marche!

    Si y'en a qui connaisse une autre écriture je suis preneur.

  8. #8
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 267
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 267
    Points : 13 530
    Points
    13 530
    Par défaut
    Sous R, les nombres scientifiques s'écrivent ainsi 1.0e-01. N'est-ce pas?

    Sinon, plutôt que d'inonder le fil de scripts, ne peux-tu pas exprimer ton besoin en bon français?
    Parce que là, ça n'a ni queue ni tête

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 587
    Points : 19 466
    Points
    19 466
    Par défaut
    Citation Envoyé par erreurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    bash: 1.2 > 0.1 : commande introuvable
    ++ bc
    + '[' -eq 1 ']'
    bash: [: -eq : opérateur unaire attendu
     "${lr[${j}]} < ${lr[${8}]}" | bc )
    il faut afficher les données sur l'entrée standard de bc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if test $(echo "${li[i]} < ${li[8]}" | bc ) -eq 1; then f1=1; fi
    8 le huitième élément du tableau, pas $8 le huitième argument du script.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 27
    Points : 18
    Points
    18
    Par défaut
    Bonjour,

    @ Flodelarab
    Oui effectivement , en tappant 10^-6 sur R on obtient bien 1.0e-06.
    En fait, j'aurais vraiment dû tester ça avant je pense

    merçi Flodelarab

    @N_BaH

    merçi c'est bien ça que je cherchais et cela résoud les problèmes.

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

Discussions similaires

  1. Exception pour gérer les nombres négatifs
    Par bilou_12 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 01/02/2012, 18h35
  2. afficher les paramètres d'un script shell avec une boucle for
    Par nakatami dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 15/03/2011, 19h21
  3. Réponses: 21
    Dernier message: 01/09/2008, 11h16
  4. [Système] Exec pour script shell
    Par Tempotpo dans le forum Langage
    Réponses: 9
    Dernier message: 31/08/2006, 14h08
  5. Réponses: 5
    Dernier message: 25/07/2005, 09h29

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