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
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
A voir également:
- Grep entre deux occurences
- Itinéraire google map entre deux adresses - Guide
- Deux comptes whatsapp - Guide
- Deux ecran pc - Guide
- Somme si entre deux dates ✓ - Forum Excel
- Faire deux colonnes sur word - Guide
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
4 mars 2011 à 14:18
Salut,
Pourquoi "grep", c'est une obligation ?
Parce que "awk" est tout indiqué pour ça...
Pourquoi "grep", c'est une obligation ?
Parce que "awk" est tout indiqué pour ça...
awk -F";" '{ print $2 }' "ADRESSES LYCEES.csv"
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
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
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 :
Seul le dernier est bon et réellement attendu, les autres apparaissent car le nom Jules Ferry est dans leur adresse
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
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
4 mars 2011 à 15:32
Pour "awk" (sous GNU/LInux) :
-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.
$ 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.
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
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 $
;-))
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
4 mars 2011 à 16:39
ça semble fonctionner avec GAWK sauf au niveau de la casse
peut être des guillemets mal placés ?
Merci
GAWK "BEGIN {IGNORECASE=1;} -F";" "$2 ~ /.*%%a/ { print $0 }"" "ADRESSES LYCEES.txt" | SED...
peut être des guillemets mal placés ?
Merci
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
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"
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
4 mars 2011 à 17:21
Super, ça semble très bien fonctionner, merci zipe31 ainsi que pour les explications ! Donc sous Windows cela donne
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 :
é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 :
=> 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 :)
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 :)
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
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 ;-)