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 :

Incrémentation d'une matrice xyz avec bash


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 162
    Par défaut Incrémentation d'une matrice xyz avec bash
    Bonjour,

    Je vous explique le problème :
    J'ai une matrice contenant des points en coordonnées cartésiennes :
    a 1 2 3
    b 4 5 3
    c 7 6 4

    et je voudrais faire une grille c'est a dire pour a b et c générer toutes les géométries possibles en ajoutant de manière itérative par exemple 0,5 à tous les x dix fois et 0,2 à tous les y 20 fois. Soit 200 géométries différentes !

    pour ça j'ai utilisé utilisé la commande awk:

    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
     
     
    ligne=1
    x[0]=0.5
    y[O]=0.1
    while [[ $ligne -le 3 ]]
        do
     
    x[$ligne]=$(awk -v varx=$ligne 'NR==varx {print $2 }' fichier) #récupère le nombre dans la deuxième colonne
    y[$ligne]=$(awk -v vary=$ligne 'NR==vary {print $3 }' fichier)
     
    x[$ligne]=` expr ${x[$ligne]} + ${x[0]} ` |bc
    y[$ligne]=` expr ${y[$ligne]} + ${y[0]} ` |bc
     
    echo  "x[$ligne] = " ${x[$ligne]}
    echo  "y[$ligne] = " ${y[$ligne]}
     
     
    ((ligne++))
     
        done
    Si j'ai bien compris le seul moyen de générer des variables dynamiques c'est d'utiliser un tableau mon problème c'est que les tableaux demandent un entier, lors de l'exécution j'ai cette erreur : expr: non-integer argument !
    Comment puis-je faire pour effectuer des opérations dans les tableaux car je n'ai rien trouvé jusqu'à présent.
    De plus si vous aviez des suggestions sur l'organisation des diverses boucles à faire je suis preneur (je pense qu'il en faut au moins deux, d'une manière générale j'ai du mal à voir comment les organiser)

    En vous remerciant,
    Erlen

  2. #2
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    un lien intéressant sur la manipulation des tableaux en bash
    http://tldp.org/LDP/abs/html/arrays.html

    bonne chance

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    Bonjour Erlen,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x[$ligne]=` expr ${x[$ligne]} + ${x[0]} ` |bc
    y[$ligne]=` expr ${y[$ligne]} + ${y[0]} ` |bc
    j'ai cette erreur : expr: non-integer argument
    il semblerait que expr, comme bash, ne sait pas faire d'opérations arithmétiques avec des nombres à virgules...
    plus, pourquoi ensuite passer la "valeur" à bc ?
    donc plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    x[$ligne]=$(echo "${x[$ligne]} + ${x[0]}" |bc)
    y[$ligne]=$(echo "${y[$ligne]} + ${y[0]}" | bc)
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 162
    Par défaut
    Je vous remercie pour ta réponse N_bas qui m'a bien aidé.
    En fait je me rends compte que mon plus gros problème est en fait la conception du script dans sa globalité. J'ai du mal à concevoir la structure :
    J'ai le fichier totox0y0 et de là il faudra générer les fichiers totox0y1 totox0y2
    totox0y3 ...
    puis totox1y0 ...
    totoxnyn
    J'ai du mal à voir comment emboîter les boucles les unes dans les autres
    c'est sans doute
    boucle modification des x
    boucle modification des y
    fin de boucle modification des y
    fin de boucle modification des x
    Est-ce que j'en ai besoin de plus ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
     
    while read ref1 ref2 x y
    do echo -n "$ref1 | $ref2 | $x "
       for ((n=0; n<10; n++)); do x=$(echo "$x + 0.5" |bc); echo -n "$x "; done
       echo -n "| $y "
       for ((n=0; n<20; n++)); do y=$(echo "$y + 0.2" |bc); echo -n "$y "; done
       echo "|"
    done < Erlen.in
    ...
    ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 162
    Par défaut
    Merci pour tous tes conseils j'ai fini ça marche impek.
    Et ca me faire gagner un temps FOU !! parce que 15 lignes à modifier dans 400 fichiers ça en fait du travail !!!
    Vive les scripts !!

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

Discussions similaires

  1. auto-incrémentation sur une primary key avec sql server
    Par pops4 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/05/2007, 14h24
  2. Réponses: 6
    Dernier message: 07/02/2007, 15h03
  3. Afficher une matrice 3d avec OpenGl
    Par kmaniche dans le forum OpenGL
    Réponses: 9
    Dernier message: 03/02/2006, 13h21

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