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 :

Parcourir un fichier log ligne par ligne et comparer des valeurs precises de chaque ligne


Sujet :

Shell et commandes GNU

  1. #21
    Membre actif
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations forums :
    Inscription : Mai 2011
    Messages : 192
    Points : 250
    Points
    250
    Par défaut
    Alors vraiment le traitement de fichier (ligne par ligne qui plus est) n'est pas ma tasse de miel . Je voulais rediger un script me permettant de separer les lignes avec les actions successives manger, dormir, rever. Donc en gros tester que la ligne contient manger, ensuite tester que la suivante contient dormir et que la suivante contient rever. Je voulais ensuite verifier que les lignes sont identiques sans toutefois tester l'action car je les aurais deja alignees. Donc voici ce que j'ai 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
    #!/bin/bash
     
    #sed 's/[ ,]/|/g' fichier | while IFS='|' read -r col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14; do 
    while IFS='|' read -r ligne; do
        # afficher le separateur sur toutes les lignes contenant le mot manger
        if [[ $ligne == *"manger"* ]]; then
    	afficherligne="oui"
    	echo "----------separateur------------->>"
    	#if [[ $ligne == *"dormir"* ]]; then
    	#   oldligne=$ligne
        	#fi
        fi
        # afficher les lignes (le separateur se trouvera avant chaque ligne contenant le mot manger)
        if [[ $afficherligne == "oui" ]] ; then
            echo "$ligne"
       fi 
    done < fichier
    Cependant je me suis rendu compte que je ne sais pas comment dire a mon script d'aller sur la ligne suivante apres avoir fini la ligne courante et je ne sais pas non plus comment comparer deux lignes (pour tester une valeur precise sur chaque ligne) .

    comme vous vous doutez voici mon resultat
    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
    ----------separateur------------->>
    mardi, 25 Decembre 2017 19:50:50 Rouen|Charles| - |manger| -
    mardi, 25 Decembre 2017 19:50:50 Rouen|Charles| - |dormir| -
    mardi, 25 Decembre 2017 19:50:50 Rouen|Charles| - |rever| -
    ----------separateur------------->>
    mardi, 25 Decembre 2017 20:10:23 Paris|Fabrice| - |manger| -
    ----------separateur------------->>
    mardi, 25 Decembre 2017 20:40:13 Strasbourg|Paul| - |manger| -
    mardi, 25 Decembre 2017 21:05:23 Dakar|Paul| - |dormir| -
    mardi, 25 Decembre 2017 21:05:23 Dakar|Paul| - |rever| -
    ----------separateur------------->>
    mardi, 25 Decembre 2017 22:35:53 Pologne|Christian| - |manger| -
    ----------separateur------------->>
    mardi, 25 Decembre 2017 22:35:53 Pologne|Christian| - |manger| -
    mardi, 25 Decembre 2017 22:35:53 Pologne|Christian| - |dormir| -
    mardi, 25 Decembre 2017 22:35:53 Pologne|Christian| - |rever| -
    ----------separateur------------->>
    mardi, 25 Decembre 2017 23:33:34 Casablanca|Benjim| - |manger| -
    mardi, 25 Decembre 2017 23:33:34 Casablanca|Benjim| - |dormir| -
    mardi, 25 Decembre 2017 23:33:34 Casablanca|Benjim| - |parler| -
    mardi, 25 Decembre 2017 23:33:34 Casablanca|Benjim| - |rever| -
    ----------separateur------------->>
    mardi, 25 Decembre 2017 23:45:54 Miami|Arno| - |manger| -
    mardi, 25 Decembre 2017 23:45:54 Miami|Arno| - |dormir| -
    mardi, 25 Decembre 2017 23:45:54 Miami|Arno| - |rever| -
    Comme vous pouvez le voir, j'ai pas pu filtrer mon fichier sur les actions
    Citation Envoyé par N_BaH
    je crois qu'en l'occurrence, pro132000 part de zéro.

    l'exercice consiste moins à ce que pro132000 mette de la confiture sur sa tartine, qu'à ce qu'il détermine comment trouver le chemin du placard de la cuisine.
    eh ben j'ai bien peur que je ne sois pas sorti de l'auberge

  2. #22
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par pro132000 Voir le message
    je ne sais pas comment dire a mon script d'aller sur la ligne suivante apres avoir fini la ligne courante
    je te disais dans une réponse précédente :
    Citation Envoyé par BufferBob Voir le message
    concernant l'algo, si tu as déjà regardé Question pour un champion le principe peut être le même, on lit chaque ligne et on la stocke pour pouvoir la comparer avec la ligne suivante quand elle sera lue, pour valider il suffit de partir d'un score = 0, à chaque fois qu'on rencontre une étape juste (comme "ligne précédente = manger ET ligne actuelle = dormir" par exemple) on incrémente le score, si l'étape est fausse on retombe à 0

    Citation Envoyé par pro132000 Voir le message
    et je ne sais pas non plus comment comparer deux lignes (pour tester une valeur precise sur chaque ligne) .
    c'est pour ça que c'est intéressant de découper en plusieurs champs facilement identifiables, on ne compare pas toute la ligne, juste le champs qui nous intéresse, on vérifie si le champs action de la ligne précédente était bien "manger" et si le même champs sur la ligne actuelle est bien "dormir", auquel cas on valide une étape, un "pallier"

    Citation Envoyé par pro132000 Voir le message
    eh ben j'ai bien peur que je ne sois pas sorti de l'auberge
    te tracasse pas trop va, pour la plupart je crois que developpez.com ne devait pas encore exister quand on a débuté et on a pas forcément eu non plus des réponses hautement didactiques quand on posait des questions, finalement on y est arrivé quand même, preuve que c'est d'abord une question de volonté/motivation personnelle, le reste viendra avec le temps

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    je ne sais pas comment dire a mon script d'aller sur la ligne suivante apres avoir fini la ligne courante
    C'est automatique. Magique non ?
    C'est exactement ce que tu fais quand tu fais un boucle "While read" alimentée par un fichier. Il lit ligne par ligne.
    C'est comme dans awk: le bloc de code entre accolade est fait pour chaque ligne. (sauf BEGIN{} et END{} évidemment)

    je ne sais pas non plus comment comparer deux lignes
    A un moment ou un autre, il faudra stocker l'information, puisque chaque tour de boucle est une ligne différente.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while IFS='|' read -r ligne
    Redéfinir l'IFS, c'est bien. Mais si tu ne sépares pas tes infos après, je ne comprends pas.
    Sans doute seras-tu intéressé par le remplissage automatique de tableau ?
    Par la suite, tu accéderas à la première donnée par ${tableau[0]} et la seconde par ${tableau[1]}, etc


    Enfin, si ton but est purement de la modification de fichier texte, tu devrais te former à awk.
    Compare la forte quantité de code que tu produis et la faible quantité de code que tu pourrais produire avec awk.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  4. #24
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Si tu regardes les 2 scripts bash que j'ai posté, tu devrais pouvoir y trouver tes réponses.
    Cordialement.

  5. #25
    Membre actif
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations forums :
    Inscription : Mai 2011
    Messages : 192
    Points : 250
    Points
    250
    Par défaut
    Citation Envoyé par BufferBob
    je te disais dans une réponse précédente

    c'est pour ça que c'est intéressant de découper en plusieurs champs facilement identifiables, on ne compare pas toute la ligne, juste le champs qui nous intéresse, on vérifie si le champs action de la ligne précédente était bien "manger" et si le même champs sur la ligne actuelle est bien "dormir", auquel cas on valide une étape, un "pallier"
    En effet j'ai bien lu cela et c'est ca que j'ai essaye de faire sur la partie en commentaire mais c'est l'interpretation en bash facile qui me pose probleme.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #sed 's/[ ,]/|/g' fichier | while IFS='|' read -r col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12 col13 col14; do
    J'ai voulu uniformiser la separation afin de ne traiter que les champs

    Citation Envoyé par Flodelarab
    C'est exactement ce que tu fais quand tu fais un boucle "While read" alimentée par un fichier. Il lit ligne par ligne.
    mais ma difficulte etait de comparer le champ de la ligne 1 a celui de la ligne 2 etc

    Citation Envoyé par Flodelarab
    A un moment ou un autre, il faudra stocker l'information, puisque chaque tour de boucle est une ligne différente.
    Ce que j'ai essaye de faire incluant ce if en commentaire dans la boucle while. En fait j'ai essaye de faire apres un tas de bidouille n'ayant pas vraiment abouti. Ce sont les restes que vous voyez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #if [[ $ligne == *"dormir"* ]]; then
    	#   oldligne=$ligne
        	#fi
    Citation Envoyé par Flodelarab
    Sans doute seras-tu intéressé par le remplissage automatique de tableau ?
    Je vais m'y pencher merci

    Citation Envoyé par Flodelarab
    Enfin, si ton but est purement de la modification de fichier texte, tu devrais te former à awk.
    Compare la forte quantité de code que tu produis et la faible quantité de code que tu pourrais produire avec awk.
    Awk est vraiment puissant et j'essaie aussi de decortiquer les exemples donnes pour comprendre ce qui est fait de bout en bout. En fait mon but est de produire un code que je comprendrai parfaitement et j'essaierai de l'optimiser au fur et a mesure grace aux explications et exemples que vous m'avez donnes ainsi que par mes lectures.

    Citation Envoyé par disedorgue
    Si tu regardes les 2 scripts bash que j'ai posté, tu devrais pouvoir y trouver tes réponses.
    je decortique justement tes lignes de code pour mieux comprendre car au vu du resultat je comprends grosso modo ce que tu fais mais maintenant j'essaie de comprendre precisement la signification de chaque ligne.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 389
    Points
    19 389
    Par défaut
    mon but est de produire un code que je comprendrai parfaitement
    je vais insister : as-tu regardé ce que peut faire un arbre de décision ?
    parce que AVANT de produire/comprendre un code, il faut produire/comprendre l'enchaînement actions à réaliser pour atteindre l'objectif fixé.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #27
    Membre actif
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations forums :
    Inscription : Mai 2011
    Messages : 192
    Points : 250
    Points
    250
    Par défaut
    Oui j'ai deja regarde en effet. merci

  8. #28
    Membre actif
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations forums :
    Inscription : Mai 2011
    Messages : 192
    Points : 250
    Points
    250
    Par défaut
    Bonsoir a tous les membres eminents du script, desole pour la grosse attente mais a force de courir a gauche et droite, j'ai pas pu travailler ce script afin de vous pondre ce que j'aurai pu produire mais j'ai fini par le faire. Avant tout, je vous explique la logique de traitement de mon script:

    • je traite le fichier pr avoir les 3 champs quon demande: time, user, action. donc au final jai un resultat de 3 colonnes ayant respectivement les valeurs citees

    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
    sed 's/[ ,]/|/g' fichier | awk -F'|' '{ print $6" "$8" "$12}'
    19:50:50 Charles manger
    19:50:50 Charles dormir
    19:50:50 Charles rever
    20:10:23 Fabrice manger
    20:40:13 Paul manger
    21:05:23 Paul dormir
    21:05:23 Paul rever
    22:35:53 Christian manger
    22:35:53 Christian manger
    22:35:53 Christian dormir
    22:35:53 Christian rever
    23:33:34 Benjim manger
    23:33:34 Benjim dormir
    23:33:34 Benjim parler
    23:33:34 Benjim rever
    23:45:54 Arno manger
    23:45:54 Arno dormir
    23:45:54 Arno rever
    • maintenant je mets ces resultat dans un tableau. a partir du tableau et de la structure de mon fichier que je maitrise, je jongle un peu pour mieux traiter les indices du tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    j=0 
    #pour chaque element du fichier formate
    for i in $(sed 's/[ ,]/|/g' fichier | awk -F'|' '{ print $6" "$8" "$12}')
    do 
    	#on va creer un tableau contenant notre fichier
    	tab[$j]=$i #on le met dans un tableau au rang i
    	j=$j+1 #on incrémente le compteur pour créer une nouvelle case la prochaine fois
    done
    • maintenant voici mon arbre de decision (N_BaH j'espere que je ne trompe pas sur le terme ): je prends la 1ere ligne (facon de parler car on est a present dans le tableau et non le fichier), je compare le temps de la 1ere ligne a celui de la 2e ligne ainsi que le temps de la 1ere ligne a celui de la 3e ligne, donc pour etre sur que le temps sur les 3 lignes successives sont egales. si les temps sont egaux alors je fais de meme avec les utilisateurs pour etre certain que j'ai le meme user sur les 3 lignes successives. Si cest le cas alors je verifie maintenant que l'action de la 1ere ligne est manger, que celle de la 2e ligne est dormir et que celle de la 3 ligne est rever (dc ce doit etre des actions successives). si cest le cas, je liste donc l'utilisateur de la ligne courante que j'ai prise pour les tests en cas de succes.

    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
    #!/bin/bash
     
    j=0 
    #pour chaque element du fichier formate
    for i in $(sed 's/[ ,]/|/g' fichier | awk -F'|' '{ print $6" "$8" "$12}')
    do 
    	#on va creer un tableau contenant notre fichier
    	tab[$j]=$i #on le met dans un tableau au rang i
    	j=$j+1 #on incrémente le compteur pour créer une nouvelle case la prochaine fois
    done
     
    #on parcourt la liste de tous les indices du tableau pour traiter les valeurs qui nous interessent
    for i in ${!tab[*]}
    do
    	#on verifie que le temps est le meme
    	if [[ "${tab[$i]}" == "${tab[$i+3]}" && "${tab[$i]}" == "${tab[$i+6]}" ]]
    	then
    		#on verifie que la personne est la meme
    		if [[ "${tab[$i+1]}" == "${tab[$i+4]}" && "${tab[$i+1]}" == "${tab[$i+7]}" ]]
    		then
    			#on verifie que les actions successives sont manger, dormir, rever
    			if [[ "${tab[$i+2]}" == 'manger' && "${tab[$i+5]}" == 'dormir' && "${tab[$i+8]}" == 'rever' ]]
    			then
    				#on affiche les personnes qui respectent les conditions
    				echo ${tab[$i+1]}
    			fi
    		fi
    	fi
    	#on va a la "ligne" suivante de notre fichier 
    	i=i+3
    done
    je sais, il est tout flou et contient beaucoup de choses a ameliorer. Ne me demandez pas lesquels mais je sais que c'est un brouillon super ambigue que je vous presente la mais comme je le disais, pour moi voici le script bash debutant que je comprends mais avec vos exemples et les documentations dans lesquelles je me plonge je pense que je pourrai m'ameliorer d'avantage.

    Si vous avez des ameliorations a me suggerer je suis preneur et je vous remercie deja pour votre reactivite et votre temps a tous. En fonction de vos suggestions et retours, je pourrai mettre le sujet en resolu. Je ne le fais pas encore juste pour pouvoir recuellir vos retours et je vous remercie grandement pour le temps que vous m'avez consacre.

    Cordialement.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 389
    Points
    19 389
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    declare -i j #cf. help declare
    for...
       tab[$j]=... #si j n'existe pas il lui sera assignée la valeur 0
       j+=1
    done
    ou mieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for...
       ar[j++]=... #parce que dans le contexte de l'assignation d'un index opère une évaluation arithmétique.
    done
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for ((i=0;i<${#tab[*]};i+=3)); do ... done
    ton algorithme ne me convainc pas, car tu lis les lignes trois par trois.
    or, si les trois premières lignes (par exemple) ne correspondent pas, mais que les trois lignes en partant de la deuxième, elles, correspondent à la requête, elles ne seront pas validées. :/
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #30
    Membre actif
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations forums :
    Inscription : Mai 2011
    Messages : 192
    Points : 250
    Points
    250
    Par défaut
    Salut, et merci pour ton intervention avec ces ameliorations que tu me proposes.
    ton algorithme ne me convainc pas, car tu lis les lignes trois par trois.
    or, si les trois premières lignes (par exemple) ne correspondent pas, mais que les trois lignes en partant de la deuxième, elles, correspondent à la requête, elles ne seront pas validées. :/
    je t'avoue que je suis un peu surpris par car il y a l'utilisateur Charles qui correspond a ce cas. c'est meme a cause de son cas que je me suis entete a lire les ligne 3 par 3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    22:35:53 Christian manger
    22:35:53 Christian manger
    22:35:53 Christian dormir
    22:35:53 Christian rever
    Pourtant il est bien en resultat avec ce que j'ai ecrit

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 389
    Points
    19 389
    Par défaut
    ah, non, d'accord, tu ne lis pas les données ligne par ligne, mais les données trois par trois.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in $(sed 's/[ ,]/|/g' fichier | awk -F'|' '{ print $6" "$8" "$12}')
    désolé, j'ai mal lu ton code. :/
    en fait, l'élément 0 du tableau contient l'heure
    l'élément 1 contient le nom
    et l'élément 2 contient l'action
    et ainsi de suite.

    je répète tellement de ne pas faire ça, que j'ai cru qu'on m'écoutait.

    du coup, je ne sais pas quoi dire. ça fonctionne, mais ça me semble étrange...

    la première boucle n'est pas nécessaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab=( $(sed 's/[ ,]/|/g' fichier | awk -F'|' '{ print $6" "$8" "$12}') )
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #32
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Non, le script n'est pas étrange, il n'est pas totalement fini, car ici, dans le meilleur (et je dis bien le meilleur) des cas, 2 itérations sur 3 sont fausses:

    On fait la première itération et on obtient que la personne respecte les conditions, dans ce cas, à la deuxième et troisième itération, on est sure d'être faux car si les ligne 1,2 et 3 sont en corrélation, alors les lignes 2,3 et 4 ainsi que les lignes 3,4 et 5 ne peuvent pas l'être...
    Cordialement.

  13. #33
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    la première boucle n'est pas nécessaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab=( $(sed 's/[ ,]/|/g' fichier | awk -F'|' '{ print $6" "$8" "$12}') )
    de fait le sed non plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F'[ |]+' '{print $5" "$7" "$9}' fichier
    edit: une autre variante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    awk -F'[ |]+' '{print $5" "$7" "$9}' fichier | while read quand qui quoi; do
       if [[ "${quand}${qui}" = "${old_quand}${old_qui}" ]]; then
          if [[ "${old_quoi}" = "manger" && "${quoi}" = "dormir" ]] ||
             [[ "${old_quoi}" = "dormir" && "${quoi}" = "rever" ]]; then ((score++))
          else score=0; fi
       else score=0; fi
       if [[ $score -eq 2 ]]; then echo "$qui"; score=0; fi
       old_quand=$quand; old_qui=$qui; old_quoi=$quoi
    done

  14. #34
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Moi, j'aimais bien l'algo que j'avais proposé et qui cherche à "prédire" ce qu'on attend:
    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
    # ligne_suivante_attendue := "rien"
     
    # Pour chaque ligne_courante, avec le "|" comme séparateur de champs
    #   si le 4ème champ == "manger"
    #   alors ligne_suivante_attendue := ligne_courante avec remplacement du 4ème champ "manger" par "dormir"
     
    #   sinon si ligne_courante != ligne_suivante_attendue
    #   alors ligne_suivante_attendue := "rien"
     
    #   sinon # on a trouvé la ligne suivante attendue
    #      suivant que le 4ème champ est:
    #         "dormir":
    #            alors ligne_suivante_attendue := ligne_courante avec remplacement du 4ème champ "dormir" par "rever"
     
    #         "rever":
    #            alors # on a trouvé un bon candidat
    #              ligne_suivante_attendue := "rien"
    #              imprimer le 2ème champ
     
    #       fin suivant que
    #   fin si
    # fin pour chaque ligne_courante
    Qui s'implémente en:
    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
    next=''
    awk -F'[ |]+' '{print $5" "$7" "$9}' | while read quand qui quoi; do
     
        if [ "${quoi}" = 'manger' ]
        then next="${quand}${qui}dormir"; continue
        fi
     
        if [ "${quand}${qui}${quoi}" != "${next}" ]
        then next=''; continue
        fi
     
        if [ "${quoi}" = 'dormir' ]
        then next="${quand}${qui}rever"; continue
        fi
     
        if [ "${quoi}" = 'rever' ]
        then next=''
             echo "$qui"
        fi
    done
    ou, en plus compact:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    awk -F'[ |]+' '{print $5" "$7" "$9}' | while read quand qui quoi; do
        if [ "${quoi}" = 'manger' ]
        then next="${quand}${qui}dormir"
        elif [ "${quand}${qui}${quoi}" != "${next}" ]
        then next=''
        elif [ "${quoi}" = 'dormir' ]
        then next="${quand}${qui}rever"
        elif [ "${quoi}" = 'rever' ]
        then next=''; echo "$qui"
        fi
    done

  15. #35
    Membre actif
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations forums :
    Inscription : Mai 2011
    Messages : 192
    Points : 250
    Points
    250
    Par défaut
    Citation Envoyé par N_BaH
    en fait, l'élément 0 du tableau contient l'heure
    l'élément 1 contient le nom
    et l'élément 2 contient l'action
    et ainsi de suite
    Exact.

    Citation Envoyé par N_BaH
    je répète tellement de ne pas faire ça, que j'ai cru qu'on m'écoutait.
    disons que j'ai essaye un truc que je comprendrai un peu mieux

    Citation Envoyé par N_BaH
    la première boucle n'est pas nécessaire :
    Ca montre que je dois ameliorer ma comprehension sur les tableaux car je passais par la boucle pensant que c'est grace a elle que je pouvais creer le tableau a partir des differentes donnees de mon fichier

    Citation Envoyé par disedorgue
    On fait la première itération et on obtient que la personne respecte les conditions, dans ce cas, à la deuxième et troisième itération, on est sure d'être faux car si les ligne 1,2 et 3 sont en corrélation, alors les lignes 2,3 et 4 ainsi que les lignes 3,4 et 5 ne peuvent pas l'être...
    En effet mais a te lire j'ai plus l'impression que ce n'est pas une bonne facon de proceder meme si j'obtiens les resultats voulus . Si c'est le cas alors je dois ameliorer mes bonnes pratiques

    Citation Envoyé par BufferBob
    de fait le sed non plus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F'[ |]+' '{print $5" "$7" "$9}' fichier
    plutot pratique ce que tu as mis.

    Citation Envoyé par jack-ft
    Moi, j'aimais bien l'algo que j'avais proposé et qui cherche à "prédire" ce qu'on attend:
    tous vos codes sont geniaux cest juse que j'ai voulu partir un peu de zero comme j'aurai mieux compris et cela m'a permis aussi de mieux comprendre (meme sil yen a que j'etudie encore) vos codes car ils etaient plutot elabores et vraiment tres brefs

  16. #36
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Citation Envoyé par pro132000 Voir le message
    En effet mais a te lire j'ai plus l'impression que ce n'est pas une bonne facon de proceder meme si j'obtiens les resultats voulus . Si c'est le cas alors je dois ameliorer mes bonnes pratiques
    Mais non, je n'ai pas dis ça, je suggèrais que c'était améliorable sur un point de vu algorithmique, par contre, je viens de voir une erreur dans ton script:

    Après tous les if, à la fin de la boucle for, tu fais un i=i+3, or déjà, la syntaxe est fausse et en plus elle ne sert à rien car le for va le modifier de suite en lui fournissant le prochaine indexe du tableau, ce qui est pire que ce que j'avais expliqué car tu avances, en fait, champs par champs et non ligne par ligne.

    La boucle for (sous cette forme) n'est pas adaptée, le mieux aurait été une boucle while qui ne s'arrête que lorsque ton compteur i est supérieur à l'indexe de la troisième ligne avant la fin.

    Et si la personne correspond aux critères, cela veut dire que les trois lignes que tu vérifiais à cet instant ne sont plus utiles pour la suite, et donc que tu peux directement passer au trois nouvelles lignes suivantes et non juste à la ligne suivante.
    Cordialement.

  17. #37
    Membre actif
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations forums :
    Inscription : Mai 2011
    Messages : 192
    Points : 250
    Points
    250
    Par défaut
    Citation Envoyé par disedorgue
    Après tous les if, à la fin de la boucle for, tu fais un i=i+3, or déjà, la syntaxe est fausse et en plus elle ne sert à rien car le for va le modifier de suite en lui fournissant le prochaine indexe du tableau, ce qui est pire que ce que j'avais expliqué car tu avances, en fait, champs par champs et non ligne par ligne.
    Il est vrai que pour moi connaissant la structure de mon fichier (3 champs par ligne), c'est par abus que je parlais de ligne par ligne et justement mon i=i+3 etait pour moi le moyen de passer au 1er champ de la ligne suivante si mes conditions sont verifiees. Raison pour la laquelle je pensais que la boucle for prendrait cela en compte mais a bien relire je comprends mieux ce que tu expliques

    Citation Envoyé par disedorgue
    La boucle for (sous cette forme) n'est pas adaptée, le mieux aurait été une boucle while qui ne s'arrête que lorsque ton compteur i est supérieur à l'indexe de la troisième ligne avant la fin.

    Et si la personne correspond aux critères, cela veut dire que les trois lignes que tu vérifiais à cet instant ne sont plus utiles pour la suite, et donc que tu peux directement passer au trois nouvelles lignes suivantes et non juste à la ligne suivante.
    Lorsque j'ai pense utiliser un tableau, je ne savais plus trop comment poser la condition et traiter mon fichier. Je te remercie pour ces indices supplementaires

  18. #38
    Membre actif
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations forums :
    Inscription : Mai 2011
    Messages : 192
    Points : 250
    Points
    250
    Par défaut
    Salut,

    je tenais a vous remercier une fois de plus pour votre temps. Avec toutes vos idees et eclaircissements, je pense que je pourrais faire mieux donc je vais passer le sujet en resolu.

    Cordialement.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Parcourir un fichier .LOG
    Par tania_hf dans le forum SAS Base
    Réponses: 4
    Dernier message: 07/07/2014, 14h50
  2. Remplacer la 1er virgule de chaque ligne par une tabulation
    Par michel42 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 16/05/2012, 17h12
  3. Réponses: 18
    Dernier message: 24/06/2011, 15h13
  4. [AC-2003] récupérer les valeur d'une textbox ligne par ligne
    Par 0sef40 dans le forum VBA Access
    Réponses: 5
    Dernier message: 07/06/2011, 09h22
  5. Réponses: 6
    Dernier message: 17/01/2007, 12h30

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