Grep entre deux occurences

Fermé
eZula Messages postés 3391 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 - 4 mars 2011 à 14:12
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 4 mars 2011 à 17:51
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

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 415
4 mars 2011 à 14:18
Salut,

Pourquoi "grep", c'est une obligation ?

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

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

0
eZula Messages postés 3391 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 392
4 mars 2011 à 15:01
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 415
4 mars 2011 à 15:32
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 415
4 mars 2011 à 15:33
Sinon avec "grep" toujours sous GNU/LInux :

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

;-))
0
eZula Messages postés 3391 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 392
4 mars 2011 à 16:39
ç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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 415
4 mars 2011 à 16:46
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
eZula Messages postés 3391 Date d'inscription samedi 26 avril 2008 Statut Contributeur Dernière intervention 8 mai 2021 392
4 mars 2011 à 17:21
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
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 415
4 mars 2011 à 17:51
$ 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