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 :

Condition sur les colonnes d'un fichier


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 37
    Par défaut Condition sur les colonnes d'un fichier
    Bonjour,

    voici mon problème.

    J'ai un fichier de 3 colonnes (et plusieurs lignes).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Nom De Dm
    N1  v1 v1'
    N2  v2 v2'
    . . .
    etc
    (PS: les N sont des noms et les V sont des valeurs(chiffres flotants), la première ligne n'existe pas je l'ai écrit pour me faire comprendre.)

    Je veux que mon programme parcours les colonnes de ce fichier tel que:
    si De courante est supérieur à l'ensemble des De faire un traitement
    pour cela je me suis dit que forcément De courante va être supérieur à max(De) du coup mon script est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    maxDe=$(cut -d" " -f2 $InputFile | sort -n | sed '1,${$b;d}') #maximum de la deuxième colonne
    condition=$(awk -v var="$maxDe" '$2 > var {print "true"}' $InputFile)
    if [ "$Condition" = "true" ];  then .....
    par contre je me suis bloquée comment écrire si mon De courant est égale à l'ensemble des De
    Je ne sais ni comment l'écrire ni comment la simplifier comme ce que j'ai faits avant.

    Question1: Est-ce que, ce que j'ai faits au début est correcte logiquement (moi il me donne les résultats que je veux, mais je ne sais pas si c'est vraiment correct le fait de dire que : "si De courante est supérieur à l'ensemble des De faire un traitement" est équivalent à "si De courante est supérieur à max(De) faire un traitement"
    Question2: je ne sais pas du tout comment me prendre pour le deuxième cas!!

    Merci par avance pour votre aide

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

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

    je n'ai pas fait de maths, mais
    si <valeur> est supérieure à l'ensemble des <valeur>s
    ne me semble pas mathématiquement correct.

    poser clairement ton énoncé, avec des termes précis (non-ambigu), t'aidera à y voir clair.
    du coup, ça nous aidera aussi.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre averti
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 37
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    je n'ai pas fait de maths, mais ne me semble pas mathématiquement correct.

    poser clairement ton énoncé, avec des termes précis (non-ambigu), t'aideras à y voir clair.
    du coup, ça nous aideras aussi.
    Je donne un exemple:
    supposons j'ai dans mon fichier que deux lignes tel que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    N  De  Dm
    N1 val1 val1'
    N2 val2 val2'
    si De(N1)>De(N2) faire un traitement
    si De(N1)=De(N2) faire un traitement

    mais moi j'ai voulu généraliser, car j'ai plusieurs lignes dans mon fichiers donc il y a plusieurs comparaison (je dois parler en terme de De courante)

    J'espère que je suis plus claire maintenant

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 640
    Par défaut
    quel rapport avec la valeur maximale d'une colonne ?
    aucune valeur de cette colonne ne sera jamais supérieure à la valeur maximale; éventuellement égale, ou inférieure.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre averti
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 37
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    quel rapport avec la valeur maximale d'une colonne ?
    aucune valeur de cette colonne ne sera jamais supérieure à la valeur maximale; éventuellement égale, ou inférieure.
    ce que je voulais dire.
    si De courante>De faire Traitement. est équivalant à si De courante >max(De) faire traitement
    car la plus grande valeur de la colonne De c'est max(De) pour ne pas faire tout les comparaisons avec toutes les valeurs de la colonne il suffit de la comparer à la valeur max non?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 640
    Par défaut
    si De courante >max(De)
    ça n'arrivera jamais : toutes les valeurs de la colonne sont <= max(De)
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    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
    Par défaut
    Citation Envoyé par BIG123 Voir le message
    J'ai un fichier de 3 colonnes (et plusieurs lignes).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Nom De Dm
    N1  v1 v1'
    N2  v2 v2'
    . . .
    etc
    (PS: les N sont des noms et les V sont des valeurs(chiffres flotants), la première ligne n'existe pas je l'ai écrit pour me faire comprendre.)
    Merci d'avoir précisé cela.
    Peux-tu donner un exemple avec des valeurs?
    Un exemple représentatif (avec 5 lignes minimum) ou plusieurs fichiers d'exemple, si tu as plusieurs conditions limites.

    Je veux que mon programme parcours les colonnes de ce fichier
    Lorsque tu dis "parcourir les colonnes", tu veux bien dire "parcourir les lignes", n'est-ce pas?


    tel que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    si De courante est supérieur à l'ensemble des De faire un traitement
    Est-ce que tu veux dire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Pour chaque ligne
      si De de la ligne (2ème colonne) est égal au plus grand de tous les De (2ème colonne)
      alors faire un traitement
    Est-ce bien cela?

    Si oui, ton code me paraît presque bon!

    pour cela je me suis dit que forcément De courante va être supérieur à max(De) du coup mon script est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    maxDe=$(cut -d" " -f2 $InputFile | sort -n | sed '1,${$b;d}') #maximum de la deuxième colonne
    condition=$(awk -v var="$maxDe" '$2 > var {print "true"}' $InputFile)
    if [ "$Condition" = "true" ];  then .....
    Le début est bon, mais le reste est très alambiqué:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    maxDe=$(cut -d" " -f2 $InputFile | sort -n | sed '1,${$b;d}') #maximum de la deuxième colonne
    while read Nom De Dm ; do
      if [[ "${De}" = "${maxDe}" ]] ; then
        traitement
      fi
    done < $InputFile
    par contre je me suis bloquée comment écrire si mon De courant est égale à l'ensemble des De
    Je ne sais ni comment l'écrire ni comment la simplifier comme ce que j'ai faits avant.
    Là, j'ai du mal à comprendre! (et ma boule de cristal est en réparation)
    Veux-tu parler du cas où tous les De sont tous égaux?
    Si oui, l'algorithme fourni fonctionne.


    Question1: Est-ce que, ce que j'ai faits au début est correcte logiquement (moi il me donne les résultats que je veux, mais je ne sais pas si c'est vraiment correct le fait de dire que : "si De courante est supérieur à l'ensemble des De faire un traitement" est équivalent à "si De courante est supérieur à max(De) faire un traitement"
    Tout ensemble fini de nombres a un maximum qui a comme particularité d'être supérieur ou égal à tous les éléments (y compris lui-même).
    Donc si l'un des éléments est égal au maximum, il est forcément supérieur ou égal à tous les autres (et même à tous y compris lui-même).
    Il me semble que c'est de la logique de CM2, voir CM1...

    Question2: je ne sais pas du tout comment me prendre pour le deuxième cas!!
    Donne un exemple.

  8. #8
    Membre averti
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 37
    Par défaut
    Je m'explique.

    mon script il parcours le tableau et il doit faire toutes ces vérifications:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Si (Dm)courante < Dm faire:
    	Si (Dm)courante < De faire: Traitement1
    	Si (Dm)courante >= De faire: Traitement2
    Si (Dm)courante > Dm faire:
    	Si (De)courante > Dm faire Traitement3
    	Si (De)courante <= Dm faire Traitement4
    Si (Dm)courante = Dm faire: 
    	Si (Dm)courante=(De)courante et Dm=De faire Traitement5
    	Si (De)courante=!(Dm)courante ou De =!Dm faire Traitement6
    reboucler
    par exemple avec un tableau de deux lignes (mais moi j'ai 2000 lignes)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Nom De Dm
    N1  V1 V1'
    N2  V2 V2'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    si Dm(N1) < Dm(N2) faire:
    	si Dm(N1)<De(N2) faire T1
    	si Dm(N1)>=De(N2) faire T2
    si Dm(N1)>Dm(N2) faire:
    	si De(N1)>Dm(N2) faire T3
    	si De(N1)<=Dm(N2) faire T4
    si Dm(N1)=Dm(N2) faire:
    	si Dm(N1)=De(N1) et Dm(N2)=De(N2) faire T5
    	si De(N1)=!Dm(N1) et De(N2)=!Dm(N2) faire T6
    reboucler
    C'est ça en résumer ce que je veux faire.

    PS: pourquoi j'ai dis reboucler: car avec les traitements mon fichierInitiale va s'actualisé (mon T1 par exemple va permettre de changer les valeurs de De et de Dm ou de supprimer des lignes de ce tableau.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 640
    Par défaut
    eh bien ? tu l'as ton algo !
    tu n'as plus qu'à le rédiger; en shell, en awk ...

    «reboucler» jusqu'à quand ? de toutes façons, ce sera une boucle while.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Membre averti
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 37
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    eh bien ? tu l'as ton algo !
    tu n'as plus qu'à le rediriger; en shell, en awk ...

    «reboucler» jusqu'à quand ? de toutes façons, ce sera une boucle while.
    C'est les traitements qui m'indiquent quand est ce que je dois m'arrêter (si je trouve ce que je veux) si non il va reboucler (le fichier s'actualise vérifier si j'ai obtenu se que je veux ...ainsi de suite).

    mon problème je ne sais pas comment exprimer la troisième condition d'égalité
    c'est ce que j'ai essayé d'expliquer avant.

  11. #11
    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
    Par défaut
    Oops! Nos messages se sont croisés!

    Avec seulement 2 lignes, on peut envisager plein de besoins différents!

    Il me faut au minimum 4 lignes pour comprendre ce que tu veux:
    - soit en symbolique (comme tu as très bien fait) avec Dm(N1) Dm(N2) De(N1) De(N2) etc.
    - soit en numérique (avec des valeurs toutes différentes pour qu'il n'y ait pas de coïncidences)

  12. #12
    Membre averti
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 37
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Oops! Nos messages se sont croisés!

    Avec seulement 2 lignes, on peut envisager plein de besoins différents!

    Il me faut au minimum 4 lignes pour comprendre ce que tu veux:
    - soit en symbolique (comme tu as très bien fait) avec Dm(N1) Dm(N2) De(N1) De(N2) etc.
    - soit en numérique (avec des valeurs toutes différentes pour qu'il n'y ait pas de coïncidences)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    N  De Dm
    N1 V1 V1'
    N2 V2 V2'
    N3 V3 V3'
    N4 V4 V4'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    si Dm(N1) < Dm(N2) et à Dm(N3) et à Dm(N4) faire: 
    	si Dm(N1)<De(N2) et à De(N3) et à De(N4) faire T1 
    	si Dm(N1)>=De(N2) et à De(N3) et à De(N4) faire T2 
    si Dm(N1)>Dm(N2) et à Dm(N3) et à Dm(N4) faire:
    	si De(N1)>Dm(N2) et à Dm(N3) et à Dm(N4) faire T3 
    	si De(N1)<=Dm(N2) et à Dm(N3) et à Dm(N4) faire T4
    si Dm(N1)=Dm(N2) et à Dm(N3) et à Dm(N4) faire:
    	si Dm(N1)=De(N1) et Dm(N2) et Dm(N3) et Dm(N4)=De(N2) et De(N3) et De(N4) (respectivement) faire T5
    	si De(N1)=!Dm(N1) et De(N2) et De(N3) et De(N4)=!Dm(N2) et Dm(N3) et Dm(N4) (respectivement) faire T6 
    reboucler

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 640
    Par défaut
    c'est quand même pas surhumain

    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if test v1 -eq v2 && test v1 -eq v3 #on peut en ajouter
    then
       :do stuff
    elif test v1 -gt v2 && test v1 -gt v3 #on peut en ajouter
    then
       :do other stuff
    elif ...
    then
       ...
    fi
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  14. #14
    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
    Par défaut
    Citation Envoyé par BIG123 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    N  De Dm
    N1 V1 V1'
    N2 V2 V2'
    N3 V3 V3'
    N4 V4 V4'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    si Dm(N1) < Dm(N2) et à Dm(N3) et à Dm(N4) faire: 
    	si Dm(N1)<De(N2) et à De(N3) et à De(N4) faire T1 
    	si Dm(N1)>=De(N2) et à De(N3) et à De(N4) faire T2 
    si Dm(N1)>Dm(N2) et à Dm(N3) et à Dm(N4) faire:
    	si De(N1)>Dm(N2) et à Dm(N3) et à Dm(N4) faire T3 
    	si De(N1)<=Dm(N2) et à Dm(N3) et à Dm(N4) faire T4
    si Dm(N1)=Dm(N2) et à Dm(N3) et à Dm(N4) faire:
    	si Dm(N1)=De(N1) et Dm(N2) et Dm(N3) et Dm(N4)=De(N2) et De(N3) et De(N4) (respectivement) faire T5
    	si De(N1)=!Dm(N1) et De(N2) et De(N3) et De(N4)=!Dm(N2) et Dm(N3) et Dm(N4) (respectivement) faire T6 
    reboucler
    Il me semble que les spécifications manquent cruellement de précision!
    C'est bien pour ça que je voulais plusieurs lignes!!!

    Et que doit-on faire si Dm(N1) < Dm(N2) mais pas < Dm(N3) ni < Dm(N4) ?
    que faire si Dm(N1) < Dm(N2) et < Dm(N3) mais pas < Dm(N4) ?
    que faire si Dm(N1) < Dm(N2) et < Dm(N4) mais pas < Dm(N3) ?
    que faire si Dm(N1)>Dm(N2) et à Dm(N3) mais pas à Dm(N4) ?
    que faire si Dm(N1)>Dm(N2) et à Dm(N4) mais pas à Dm(N3) ?
    etc.

    Dans le (1er) cas où Dm(N1) < Dm(N2) et à Dm(N3) et à Dm(N4)
    que faire si si Dm(N1)<De(N2) et à De(N3) mais pas à De(N4) ?
    que faire si si Dm(N1)<De(N2) et à De(N4) mais pas à De(N3) ?
    etc.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/02/2014, 15h59
  2. Condition sur les colonnes
    Par Sannazzarotiti dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/11/2013, 17h35
  3. [XL-2003] Compléter un fichier à partir d'un autre condition sur 2 colonnes
    Par surf-max dans le forum Excel
    Réponses: 5
    Dernier message: 12/10/2013, 12h45
  4. Réponses: 3
    Dernier message: 06/06/2011, 12h56
  5. Réponses: 1
    Dernier message: 01/07/2009, 20h12

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