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 :

Division de variables décimales


Sujet :

Shell et commandes GNU

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    etudiant
    Inscrit en
    Mars 2021
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2021
    Messages : 44
    Points : 27
    Points
    27
    Par défaut Division de variables décimales
    Bonjour,
    J'ai un soucis pour diviser deux variables dont l'une est décimale. La variable 'altot' résulte de l'addition des valeurs de la colonne 1 du fichier 'Av_$i', pour 'oztot' c'est la colonne 2. Et 'ligne' représente le nombre de ligne dans ce fichier.


    Voici une partie des valeurs du fichier :

    12.071 1.33695e-07
    12.074 1.33761e-07
    12.077 1.31852e-07
    12.08 1.28458e-07
    12.083 1.33959e-07
    12.087 1.34026e-07
    12.093 1.34158e-07


    Voici mon code, mon erreur apparaît lorsque j'essaye de calculer les moyennes 'altmean' et 'ozmean' :
    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
     
    fic2=Allyear/AMA
     
    for ((i=120; i <= 221; i += 1))
    do	
           	echo $(echo "scale=2; ${i}/10" | bc ) >> tab_$i
    	fic1=tab_$i
     	awk -vp=10 'NR==FNR{arr[int($1*p)/p]++;next} (int($1*p)/p) in arr' {$fic1,$fic2}  >> Av_$i
     
    	ligne=$(cat Av_$i | wc -l)
     
    	altot=$(awk '{s+=$1} END {print s}' Av_$i)
    	altmean=$(echo "scale=5; $altot/$ligne" | bc ) 
     
     
    	oztot=$(awk '{s+=$2} END {print s}' Av_$i)
    	ozmean=$(echo "scale=9; $oztot/$ligne" | bc)
     
    	echo $altmean $ozmean >> Allyear/AvgAMA
     
    	rm tab_$i Av_$i
     
    done

    Avec comme erreur pour ces deux lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    (standard_in) 1: syntax error
    (standard_in) 1: syntax error
    Auriez-vous une idée ?
    Merci

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    Bonjour,

    le code que tu montres est erroné :
    - il doit ne pas y avoir d'espaces autour du signe égal d'une assignation de variable
    - pour obtenir le résultat d'une commande, et pas la commande elle-même, il faut utiliser une Substitution de commande.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    etudiant
    Inscrit en
    Mars 2021
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2021
    Messages : 44
    Points : 27
    Points
    27
    Par défaut
    Oui je ne voulais pas assigner des variables, j'ai juste mis ici les valeurs que j'ai (juste pour montrer ce que que contiennent mes variables), mais dans mon script les valeurs sont bien extraites depuis un fichier.

    Pour la substitution de commande, je pensais justement que $(macommande) permettait de stocker le résultat de ma commande dans ma variable, ce n'est pas le cas ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    si. c'est ça, mais ligne, altot, et oztot n'en ont pas.

    PS: pour reproduire aisément ton erreur, on doit n'avoir qu'à faire un copier/coller de ton code.
    édite ton premier message, stp, pour nous aider à t'aider.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    etudiant
    Inscrit en
    Mars 2021
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2021
    Messages : 44
    Points : 27
    Points
    27
    Par défaut
    Je viens de modifier mon premier message en rajoutant la substitution de commande pour les trois variables. Le calcul de la moyenne est bien réalisé et je n'ai plus l'erreur.


    Mais la ligne suivante ne semble pas fonctionner ( rien n'est écrit dans mon nouveau fichier)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	echo $altmean $ozmean >> Allyear/AvgAMA

    Edit : tout fonctionne finalement, j'aimerais juste savoir comment afficher la partie entière de ma valeur de 'ozmean' :
    Mon résultat est donné sous la forme :

    .0000001424
    .0000001476
    .0000001495

    Et j'aimerais si possible aussi récupérer le 0 devant la virgule

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 242
    Points : 13 457
    Points
    13 457
    Par défaut
    Bonjour

    Je ne vois pas l'intérêt de ressortir de awk, si c'est pour traiter les mêmes données, encore, et encore.

    La fonction partie entière dans awk est int().
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    etudiant
    Inscrit en
    Mars 2021
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : etudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2021
    Messages : 44
    Points : 27
    Points
    27
    Par défaut
    J'utilise awk pour comparer des données entre deux fichiers, et ranger les résultats dans un nouveau fichier.
    C'est vrai que ce n'est pas la meilleure idée de créer des fichiers intermédiaires pour ça, c'était juste une idée

    Par contre je me retrouve avec un problème :

    Je ne comprends toujours pas à quoi correspond l'erreur ' (standard_in) 1: syntax error ' :

    Pour certaines valeurs le script fonctionne bien, mais pas pour d'autres, voici le résultat :

    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
     
    738
    12.248
    9.82962e-05
    (standard_in) 1: syntax error
     
    734
    12.349
    0.000100381
    .0000001367588
     
    704
    12.449
    9.98458e-05
    (standard_in) 1: syntax error
    L'erreur intervient toujours à ce niveau du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	ozmean=$(echo "scale=13; $oztot/$ligne" | bc)
    Je pense que dans le cas où il y a l'erreur, 'oztot' est sous le format 'e-05' , et le calcul n'a pas l'air de fonctionner

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 242
    Points : 13 457
    Points
    13 457
    Par défaut
    C'est une erreur "bc". Ta demande de calcul contient une erreur.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  9. #9
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    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 276
    Points : 12 712
    Points
    12 712
    Par défaut
    Si tu veux absolument utiliser bc, essaye un truc du genre (pas testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ozmean=$(printf "scale=13; %.10f/$ligne\n" $oztot | bc)
    Cordialement.

Discussions similaires

  1. Firebird : Problème de division avec variable
    Par jolijoli dans le forum Langage SQL
    Réponses: 1
    Dernier message: 06/06/2013, 18h16
  2. Variable décimal 26 caracteres
    Par Mortlhomme dans le forum Général VBA
    Réponses: 3
    Dernier message: 19/04/2013, 21h11
  3. Diviser une variable en 3
    Par gator dans le forum Langage
    Réponses: 11
    Dernier message: 27/10/2009, 19h38
  4. multiplication et division de variables BigDecimal
    Par I.Z.M.M dans le forum Jasper
    Réponses: 5
    Dernier message: 02/10/2009, 11h49
  5. diviser une variable
    Par ledawa dans le forum Débuter avec Java
    Réponses: 14
    Dernier message: 31/07/2008, 11h10

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