Grep entre deux occurences

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. Contributeur
    Salut,

    Pourquoi "grep", c'est une obligation ?

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

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

    1. Contributeur
      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
      1. Contributeur
        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.
        1. Contributeur
          Sinon avec "grep" toujours sous GNU/LInux :

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

          ;-))
      2. Contributeur
        ç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
        1. Contributeur
          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" 
      3. Contributeur
        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 :)
        1. Contributeur
          $ 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 ;-)