Grep entre deux occurences
eZula
Messages postés
3391
Date d'inscription
Statut
Contributeur
Dernière intervention
-
zipe31 Messages postés 36402 Date d'inscription Statut Contributeur Dernière intervention -
zipe31 Messages postés 36402 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Un fichier CSV contient une liste d'adresses comme suivant :
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 ?
n'est pas assez précis
Merci :)
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 :)
A voir également:
- Grep entre deux occurences
- Nombre de jours entre deux dates excel - Guide
- Deux ecran pc - Guide
- Comment faire deux colonnes sur word - Guide
- Itinéraire google map entre deux adresses - Guide
- Deux whatsapp sur un téléphone - Guide
5 réponses
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"
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
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.
ç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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 :)
$ 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 ;-)