Grep entre deux occurences

eZula Messages postés 3509 Statut Contributeur -  
zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

Un fichier CSV contient une liste d'adresses comme suivant :

Lycée Climatique;D'ALTITUDE HONORE ROMANE;Route de Caléyère;BP. 93;05202;EMBRUN CEDEX
Lycée Professionnel;ALPES DURANCE;Quartier de la Robéyère;;05200;EMBRUN
Lycée Classique et Moderne;DOMINIQUE VILLARS;Place de Verdun;;05000;GAP
Lycée Polyvalent;ARISTIDE BRIAND;20 avenue Commandant Dumont;;05007;GAP CEDEX
...


Je dispose des noms situés entre le 1er et le 2ème ";" de chaque ligne et cherche à les trouver avec une boucle for et grep, le souci étant avec grep, à savoir comment chercher un nom qui est situé entre le 1er et le deuxième ";" d'une ligne ?

GREP -i -m 2 ";[^;]*%%a;" "ADRESSES LYCEES.csv"

n'est pas assez précis

Merci :)

5 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    Pourquoi "grep", c'est une obligation ?

    Parce que "awk" est tout indiqué pour ça...

    awk -F";" '{ print $2 }' "ADRESSES LYCEES.csv"

    0
  2. eZula Messages postés 3509 Statut Contributeur 392
     
    Merci!

    Je ne connais pas bien awk (gawk ss windows), donc pourquoi pas mais là je ne vois pas trop comment matcher le nom du lycée (par exemple "HONORE ROMANE") dans le motif "1er point virgule de la ligne - n'importe quelle chaîne de caractère sauf un point virgule - deuxième point virgule de la ligne"

    Pour info voilà la commande actuelle complète

    FOR /f "TOKENS=*" %%a IN (Lycee1.txt) DO GREP -i ";.*%%a.*;" "ADRESSES LYCEES.txt" | SED "s/;/ /;s/;/ /4;s/;/\r\n/g;s/$/\r/g;s/$/\r\n/;s/$/\r/" >> Etiq.txt


    Ca fonctionne bien sauf que le souci c'est que dans certaines adresses, il peut y avoir un nom de lycée ; par exemple admettons que je cherche le lycée "Jules Ferry", voilà les résultats qui vont sortir :

    Lycée Professionnel DE L'ETOILE
    BP 125
    14 rue Jules Ferry
    13542 GARDANNE CEDEX
    
    
    Lycée Polyvalent A. & L. LUMIERE
    Avenue Jules Ferry
    
    13600 LA CIOTAT
    
    
    Lycée Polyvalent ALPHONSE DAUDET
    BP 12
    Boulevard Jules Ferry
    13158 TARASCON CEDEX
    
    
    Lycée Technique JULES FERRY
    BP 265
    82 boulevard de la République
    06402 CANNES CEDEX


    Seul le dernier est bon et réellement attendu, les autres apparaissent car le nom Jules Ferry est dans leur adresse
    0
  3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Pour "awk" (sous GNU/LInux) :

    $ cat ezula     # Affiche le contenu du fichier
    Lycée Climatique;D'ALTITUDE HONORE ROMANE;Route de Caléyère;BP. 93;05202;EMBRUN CEDEX
    Lycée Professionnel;ALPES DURANCE;Quartier de la Robéyère;;05200;EMBRUN
    Lycée Classique et Moderne;DOMINIQUE VILLARS;Place de Verdun;;05000;GAP
    Lycée Polyvalent;ARISTIDE BRIAND;20 avenue Commandant Dumont;;05007;GAP CEDEX
    
    $ awk -F";" '$2 ~ /.*VILLARS/ { print $0 }' ezula
    Lycée Classique et Moderne;DOMINIQUE VILLARS;Place de Verdun;;05000;GAP
    
    $


    -F ";"
    Spécifie le séparateur de champs

    $2 ~ /.*VILLARS/
    Si le 2ème champ ($2) contient le mot "VILLARS" (précédé ou nom (.*) par quelque chose)
    les "/" servent à délimiter le motif

    { print $0 }
    Alors on affiche la ligne.

    Par défaut "awk" est sensible à la casse.
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Sinon avec "grep" toujours sous GNU/LInux :

      $ egrep '[^;];.*VILLARS;' ezula
      Lycée Classique et Moderne;DOMINIQUE VILLARS;Place de Verdun;;05000;GAP
      $

      ;-))
      0
  4. eZula Messages postés 3509 Statut Contributeur 392
     
    ça semble fonctionner avec GAWK sauf au niveau de la casse

    GAWK "BEGIN {IGNORECASE=1;} -F";" "$2 ~ /.*%%a/ { print $0 }"" "ADRESSES LYCEES.txt" | SED...

    peut être des guillemets mal placés ?

    Merci
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      La syntaxe pour la définitions du séparateur de champs diffère en fonction qu'on la déclare avant ou dans la section "BEGIN" :

      GAWK "BEGIN {IGNORECASE=1; FS=';' } $2 ~ /.*%%a/ { print $0 }" "ADRESSES LYCEES.txt" 
      
      GAWK -F';' "BEGIN {IGNORECASE=1; } $2 ~ /.*%%a/ { print $0 }" "ADRESSES LYCEES.txt" 
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. eZula Messages postés 3509 Statut Contributeur 392
     
    Super, ça semble très bien fonctionner, merci zipe31 ainsi que pour les explications ! Donc sous Windows cela donne

    FOR /f "TOKENS=*" %%a IN (Lycee1.txt) DO GAWK -F";" "BEGIN {IGNORECASE=1;} $2 ~ /.*%%a/ { print $0 }" "ADRESSES LYCEES.txt" | SED "s/;/ /;s/;/ /4;s/;/\r\n/g;s/$/\r/g;s/$/\r\n/;s/$/\r/" >> Etiq.txt


    avec les guillemets doubles.

    Je vais regarder la semaine prochaine un autre souci qui se pose, c'est que dans deux départements différents, des lycées peuvent avoir le même nom (toujours dans le fichier csv), par exemple :

    Lycée Polyvalent;PAUL LANGEVIN;BP 19;Avenue Fleming;13691;MARTIGUES CEDEX
    Lycée Polyvalent;PAUL LANGEVIN;Boulevard de l'Europe;;83500;LA SEYNE SUR MER CEDEX


    évidemment si je cherche le lycée langevin de Martigues, les deux vont apparaître et vice-versa. Les noms que je cherche à trouver dans ce fichier csv sont issus d'un tableau qui contient également les départements, par exemple :

    84	René Char
    06	Palmiers
    06	Léonard de Vinci
    06	Jules Ferry
    13	Aix-Valabre


    => deux premiers chiffres du département / tabulation / nom du lycée.
    Il doit surement y avoir qquechose à faire en ajoutant une condition à cette recherche dans le fichier csv, à savoir que les chiffres du département avant la tabulation doivent correspondre aux deux premiers caractères suivant le 4ème point virgule de la ligne du fichier csv.

    J'essaie d'avancer dessus, tout cela me permet de faire des étiquettes plus rapidement qu'à la main.

    Merci encore et très bon we :)
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      $ cat ezula
      Lycée Climatique;D'ALTITUDE HONORE ROMANE;Route de Caléyère;BP. 93;05202;EMBRUN CEDEX
      Lycée Professionnel;ALPES DURANCE;Quartier de la Robéyère;;05200;EMBRUN
      Lycée Classique et Moderne;DOMINIQUE VILLARS;Place de Verdun;;05000;GAP
      Lycée Polyvalent;ARISTIDE BRIAND;20 avenue Commandant Dumont;;05007;GAP CEDEX
      Lycée Polyvalent;PAUL LANGEVIN;BP 19;Avenue Fleming;13691;MARTIGUES CEDEX
      Lycée Polyvalent;PAUL LANGEVIN;Boulevard de l'Europe;;83500;LA SEYNE SUR MER CEDEX
      
      $ awk -F";" '$2 ~ /.*LANGEVIN/ && $5 ~ /^13/ { print $0 }' ezula
      Lycée Polyvalent;PAUL LANGEVIN;BP 19;Avenue Fleming;13691;MARTIGUES CEDEX
      
      $

      Je te laisse l'adapter à la sauce M$...
      ;-))

      Bon week-end à toi aussi ;-)
      0