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 :

Recherche plusieurs chaines dans une ligne


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 80
    Par défaut Recherche plusieurs chaines dans une ligne
    Bonjour,

    J'ai deux fichiers. Le premier est un fichier de paramétrage et le second, un fichier de données.

    fichier paramétrage ressemble à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    chaine01;chaine02;chaine03;chaine04
    chaine05;chaine06;chaine07;chaine08
    chaine09;chaine10;chaine11;chaine12
    Je lis le fichier de paramétrage. Pour chaque ligne de ce fichier (colonne1, colonne2 et colonne4), je souhaite rechercher celles-ci dans le fichier de données.

    le fichier de données ressemble à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    chaine01   chaine02      toto      chaine04.....
    chaine05   chaine06      tata      chaine08.....
    chaine12   chaine10      tata      chaine12......
    La condition est la présence (& logique) des colonnes 1, 2 et 4 dans le fichier de données. Si l'une de des colonnes n'est pas présente dans le fichier de données, je ne prends pas l'enregistrement.

    In fine, par rapport à cet exemple, dans mon fichier résultat, j'aurais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    chaine01     chaine02       toto      chaine04.....
    chaine05     chaine06       tata      chaine08.....
    Quant à l’enregistrement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaine12   chaine10      titi        chaine12......
    Il ira à la poubelle car la première colonne du fichier param parle de "chaine09"

    La commande grep peut-elle répondre à ce besoin ?

  2. #2
    Modérateur
    Avatar de paissad
    Homme Profil pro
    Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Inscrit en
    Avril 2006
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur de développement (Java/JEE/Eclipse RCP,EMF & webMethods)
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 043
    Par défaut
    Bonjour,
    dis en un peu plus sur les chaînes de caractères (leur composition possible)
    Est ce que ces chaînes (chaine1, chaine2 ....) peuvent contenir des espaces ?
    Quel est le caractère d'espacement de tes colonnes dans le fichier de données (un espace ? une tabulation ? ...)
    Nous n'héritons pas de la terre de nos parents, nous l'empruntons à nos enfants.
    Le chat du site est aussi ici pour aider. Ne pas hésiter à visiter !

  3. #3
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Tu peux utiliser IFS par exemple.

    Version basique :
    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
    $ cat filtre.txt
    chaine01;chaine02;chaine03;chaine04
    chaine05;chaine06;chaine07;chaine08
    chaine09;chaine10;chaine11;chaine12
    $ cat data.txt
    chaine01   chaine02      toto      chaine04 ....
    chaine05   chaine06      tata      chaine08 ....
    chaine12   chaine10      tata      chaine12 .....
    $ cat grep.bash
    #!/bin/bash
     
    while IFS=';' read colonne1 colonne2 colonne3 colonne4
    do
            grep $colonne1 data.txt | grep $colonne2 | grep $colonne4
    done < filtre.txt
    $ bash grep.bash
    chaine01   chaine02      toto      chaine04.....
    chaine05   chaine06      tata      chaine08.....
    Mais il va sans dire que le grep est assez léger dans ce cas puisqu'il ne se base pas vraiment sur une "colonne".

    Tu peux utiliser awk mais la version simple demande à ce que tu sois certain que telle colonne du filtre corresponde à telle colonne des donnés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ cat grep.bash
    #!/bin/bash
    
    while IFS=';' read colonne1 colonne2 colonne3 colonne4
    do
            awk '$1 =="'$colonne1'" && $2 == "'$colonne2'" && $4 == "'$colonne4'" {print}' data.txt
    done < filtre.txt
    $ bash grep.bash
    chaine01   chaine02      toto      chaine04 ....
    chaine05   chaine06      tata      chaine08 ....
    Après, tu peux compliqué le traitement awk pour vérifier tous les champs contre toutes les valeurs du filtre à l'aide d'un if par exemple...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 80
    Par défaut
    Est ce que ces chaînes (chaine1, chaine2 ....) peuvent contenir des espaces ?

    Non, chaine1,2 c'est en un seul mot.


    Quel est le caractère d'espacement de tes colonnes dans le fichier de données (un espace ? une tabulation ? ...)

    La 1ère colonne démarre de 1 -> 25
    La 2ème colonne démarre de 26 -> 54
    La 4ème colonne démarre de 115 -> 151

  5. #5
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    Qu'est-ce qu'il doit se passer si tu as ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    chaine01   chaine02      toto      chaine04.....
    chaine0105 chaine02      tata      chaine04.....
    chaine12   chaine10      tata      chaine12......
    ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 80
    Par défaut
    Qu'est-ce qu'il doit se passer si tu as ceci :
    La correspondance doit être exacte. Ce qui revient à dire que la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chaine0105 chaine02      tata      chaine04.....
    ne doit pas être prise car, la première colonne n'est pas chaine01 mais chaine0105

  7. #7
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Par défaut
    En considérant qu'il est possible d'avoir plusieurs occurrences valide et avec AWK :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    DesHaches:~# cat data.txt
    chaine01   chaine02      toto      chaine04
    chaine05   chaine06      tata      chaine08
    chaine12   chaine10      tata      chaine12
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    DesHaches:~# cat recherche.txt
    chaine01;chaine02;chaine03;chaine04
    chaine05;chaine06;chaine07;chaine08
    chaine09;chaine10;chaine11;chaine12
    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
     
    DesHaches:~# cat chaine.awk
    {
      RESULT=1
      while( RESULT == 1 )
         {
             RESULT=getline LIGNEDATA < "recherche.txt"
             split(LIGNEDATA,TABRESULT,";") ;
             if ( TABRESULT[1] == $1  &&  TABRESULT[2] == $2  &&  TABRESULT[4] == $4 )
              {
                  print $0
               }
     
         }
    close("recherche.txt")
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DesHaches:~# awk -f chaine.awk  data.txt
    chaine01   chaine02      toto      chaine04
    chaine05   chaine06      tata      chaine08

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

Discussions similaires

  1. rechercher plusieurs mot dans une phrase
    Par andromeda dans le forum C#
    Réponses: 5
    Dernier message: 14/10/2010, 01h34
  2. Rechercher plusieurs occurence sur une ligne
    Par trall dans le forum Débuter
    Réponses: 3
    Dernier message: 03/01/2010, 15h02
  3. [WD-2007] Selection de plusieurs mots dans une ligne
    Par csempere dans le forum VBA Word
    Réponses: 11
    Dernier message: 12/04/2009, 21h20
  4. Réponses: 2
    Dernier message: 13/11/2008, 13h38
  5. Réponses: 23
    Dernier message: 16/11/2002, 19h41

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