#1 Le 13/10/2019, à 14:30
- sebastien29800
isoler une donnée dans un texte avec 'sed awk grep" ou autre ?
bonjour à tous,
soit le fichier texte "test.txt" suivant :
<adresse>Viaduc du Chavanon</adresse>
<ville>Merlines</ville>
<services>
<service>Restauration à emporter</service>
<service>Carburant additivé</service>
<service>Restauration sur place</service>
<service>Toilettes publiques</service>
<service>Douches</service>
<service>Boutique alimentaire</service>
<service>Station de gonflage</service>
<service>Espace bébé</service>
<service>Boutique non alimentaire</service>
<service>Aire de camping-cars</service>
<service>Piste poids lourds</service>
<service>Lavage manuel</service>
</services>
<prix nom="Gazole" id="1" maj="2019-10-08 06:00:00" valeur="1.620"/>
<prix nom="GPLc" id="4" maj="2019-09-13 06:00:00" valeur="0.980"/>
<prix nom="E85" id="3" maj="2019-10-10 23:59:00" valeur="0.687"/>
<prix nom="E10" id="5" maj="2019-10-08 06:00:00" valeur="1.670"/>
<prix nom="SP98" id="6" maj="2019-10-08 06:00:00" valeur="1.770"/>
</pdv>
<pdv id="29228001" latitude="4843000" longitude="-447200" cp="29200" pop="R">
<adresse>Kergaradec - Porte de Gouesnou</adresse> **********************************************
<ville>BREST</ville>
<horaires automate-24-24="">
<jour id="1" nom="Lundi" ferme=""/>
<jour id="2" nom="Mardi" ferme=""/>
<jour id="3" nom="Mercredi" ferme=""/>
<jour id="4" nom="Jeudi" ferme=""/>
<jour id="5" nom="Vendredi" ferme=""/>
<jour id="6" nom="Samedi" ferme=""/>
<jour id="7" nom="Dimanche" ferme=""/>
</horaires>
<services>
<service>Restauration à emporter</service>
<service>Carburant additivé</service>
<service>Restauration sur place</service>
<service>Toilettes publiques</service>
<service>Bar</service>
<service>Boutique alimentaire</service>
<service>Station de gonflage</service>
<service>Espace bébé</service>
<service>Boutique non alimentaire</service>
<service>Services réparation / entretien</service>
<service>Vente de gaz domestique (Butane, Propane)</service>
<service>Location de véhicule</service>
<service>Piste poids lourds</service>
<service>DAB (Distributeur automatique de billets)</service>
<service>Wifi</service>
</services>
<prix nom="Gazole" id="1" maj="2019-10-11 08:06:11" valeur="1.377"/>
<prix nom="SP95" id="2" maj="2019-10-11 08:06:11" valeur="1.458"/>
<prix nom="E85" id="3" maj="2019-10-10 23:59:00" valeur="0.497"/> ************************************
<prix nom="E10" id="5" maj="2019-10-11 08:06:11" valeur="1.410"/>
</pdv>
je souhaiterais réussir à isoler la valeur 0.497 de la ligne E85 se trouvant juste après le mot "Kergaradec" (j'ai mis des **********************) devant les lignes concernées sachant que dans ce fichier il y a des centaines de lignes
ma logique serait de dire : je cherche le mot Kergaradec dans le fichier puis je prend la première ligne qui contient "E85" et j'isole le nombre qui se trouve après valeur="
étant nul avec les commandes adéquat (sed awk grep.....) j'en fais appel à votre sympathie !!!! ;-)
merci beaucoup
Dernière modification par sebastien29800 (Le 13/10/2019, à 14:38)
Hors ligne
#2 Le 13/10/2019, à 14:55
- Watael
Re : isoler une donnée dans un texte avec 'sed awk grep" ou autre ?
salut,
c'est un fichier XML.
il faut le traiter avec xslt.
les commandes adéquates sont xsltproc, ou xalan, ou xmlstarlet, ou python ou perl avec les modules xml
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 13/10/2019, à 14:58
- pingouinux
Re : isoler une donnée dans un texte avec 'sed awk grep" ou autre ?
Bonjour,
Voici le script recherche.py, en python :
#!/usr/bin/env python3
import re, sys
with open(sys.argv[1]) as f: s=f.read()
k=re.search('Kergaradec.*?nom="E85".*?valeur="([^"]+)"(?s)',s)
print(k.group(1))
à rendre exécutable et à lancer ainsi :
./recherche.py test.txt
Hors ligne
#4 Le 13/10/2019, à 15:04
- sebastien29800
Re : isoler une donnée dans un texte avec 'sed awk grep" ou autre ?
Bonjour,
Voici le script recherche.py, en python :#!/usr/bin/env python3 import re, sys with open(sys.argv[1]) as f: s=f.read() k=re.search('Kergaradec.*?nom="E85".*?valeur="([^"]+)"(?s)',s) print(k.group(1))
à rendre exécutable et à lancer ainsi :
./recherche.py test.txt
Merci beaucoup de prendre de ton temps pour me répondre.
le seul truc c'est que ta réponse met à mal mon projet car je voulais intégrer la réponse dans du bash !
du coup, awk sed grep.... auraient été plus adéquat ! ;-)
Hors ligne
#5 Le 13/10/2019, à 15:12
- sebastien29800
Re : isoler une donnée dans un texte avec 'sed awk grep" ou autre ?
Bonjour,
Voici le script recherche.py, en python :#!/usr/bin/env python3 import re, sys with open(sys.argv[1]) as f: s=f.read() k=re.search('Kergaradec.*?nom="E85".*?valeur="([^"]+)"(?s)',s) print(k.group(1))
à rendre exécutable et à lancer ainsi :
./recherche.py test.txt
pour ma formation, j'ai cependant testé
j'ai malheureusement ça en réponse :
Traceback (most recent call last):
File "./recherche.py", line 3, in <module>
with open(sys.argv[1]) as f: s=f.read()
File "/usr/lib/python3.5/codecs.py", line 321, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 1034: invalid continuation byte
en fait, ça fonctionne si je prend la partie du fichier que j'ai donné en exemple mais pas avec le fichier complet
Dernière modification par sebastien29800 (Le 13/10/2019, à 15:17)
Hors ligne
#6 Le 13/10/2019, à 15:37
- diesel
Re : isoler une donnée dans un texte avec 'sed awk grep" ou autre ?
Pas forcement très propre :
nom=Kergaradec ; tail -n +`grep -m 1 -n $nom test.txt | cut -d: -f1` test.txt | grep -m 1 E85 | grep -o 'valeur=\".*\"' | grep -o '\".*\"' | sed s/\"//g
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#7 Le 13/10/2019, à 15:43
- credenhill
Re : isoler une donnée dans un texte avec 'sed awk grep" ou autre ?
hello
$ awk -F '="|"/' '/Kergaradec/ {x=1} x && /E85/ {print $5; x=0}' fichier
0.497
Dernière modification par credenhill (Le 13/10/2019, à 15:44)
Hors ligne
#8 Le 13/10/2019, à 15:48
- sebastien29800
Re : isoler une donnée dans un texte avec 'sed awk grep" ou autre ?
hello
$ awk -F '="|"/' '/Kergaradec/ {x=1} x && /E85/ {print $5; x=0}' fichier 0.497
ça marche nickel merci, tu peux m'expliquer le code s'il te plait ? merci beaucoup
comment je fais si je cherche plusieurs mots avec accents et espacés par des espaces ? exemple : Hervé de Guébriant
wk -F '="|"/' '/Hervé de Guébriant/ {x=1} x && /E85/ {print $5; x=0}' test.txt
ne fonctionne pas
merci
Dernière modification par sebastien29800 (Le 13/10/2019, à 15:55)
Hors ligne
#9 Le 13/10/2019, à 15:50
- sebastien29800
Re : isoler une donnée dans un texte avec 'sed awk grep" ou autre ?
Pas forcement très propre :
nom=Kergaradec ; tail -n +`grep -m 1 -n $nom test.txt | cut -d: -f1` test.txt | grep -m 1 E85 | grep -o 'valeur=\".*\"' | grep -o '\".*\"' | sed s/\"//g
Amicalement.
Jean-Marie
merci jean-marie, sur le fichier complet ça me renvoie :
tail: nombre de lignes incorrect: «+\033[32m\033[K183946\033[m\033[K\033[36m\033[K»
Hors ligne
#10 Le 13/10/2019, à 15:54
- pingouinux
Re : isoler une donnée dans un texte avec 'sed awk grep" ou autre ?
sed -nr '/Kergaradec/{:a;/nom="E85"/!{n;ba};s/.*valeur="([^"]+)".*/\1/p;q}' test.txt
Hors ligne
#11 Le 13/10/2019, à 15:56
- diesel
Re : isoler une donnée dans un texte avec 'sed awk grep" ou autre ?
A vue de nez, je dirais qu'il y a un problème de différence d'encodage entre le fichier et le système.
Mais puisque tu as une solution plus propre qui fonctionne...
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#12 Le 13/10/2019, à 15:57
- sebastien29800
Re : isoler une donnée dans un texte avec 'sed awk grep" ou autre ?
sed -nr '/Kergaradec/{:a;/nom="E85"/!{n;ba};s/.*valeur="([^"]+)".*/\1/p;q}' test.txt
ça marche super aussi !! merci, mais pareil, comment faire si mot composé avec accent et espace ? merci
Hors ligne
#13 Le 13/10/2019, à 15:58
- sebastien29800
Re : isoler une donnée dans un texte avec 'sed awk grep" ou autre ?
A vue de nez, je dirais qu'il y a un problème de différence d'encodage entre le fichier et le système.
Mais puisque tu as une solution plus propre qui fonctionne...
Amicalement.
Jean-Marie
merci beaucoup à toi !! ;-)
Hors ligne
#14 Le 13/10/2019, à 16:09
- credenhill
Re : isoler une donnée dans un texte avec 'sed awk grep" ou autre ?
que répond
file test.txt
Hors ligne
#15 Le 13/10/2019, à 16:19
- pingouinux
Re : isoler une donnée dans un texte avec 'sed awk grep" ou autre ?
ça marche super aussi !! merci, mais pareil, comment faire si mot composé avec accent et espace ? merci
Il suffit que tu essayes, tu verras que ça ne change rien.
Hors ligne
#16 Le 13/10/2019, à 16:37
- pingouinux
Re : isoler une donnée dans un texte avec 'sed awk grep" ou autre ?
merci jean-marie, sur le fichier complet ça me renvoie :
tail: nombre de lignes incorrect: «+\033[32m\033[K183946\033[m\033[K\033[36m\033[K»
On dirait que c'est l'encodage pour faire apparaître des couleurs quand le fichier est listé dans un terminal.
Hors ligne
#17 Le 13/10/2019, à 18:49
- sebastien29800
Re : isoler une donnée dans un texte avec 'sed awk grep" ou autre ?
que répond
file test.txt
XML 1.0 document, ISO-8859 text
Hors ligne
#18 Le 13/10/2019, à 18:52
- sebastien29800
Re : isoler une donnée dans un texte avec 'sed awk grep" ou autre ?
sebastien29800 #12 a écrit :ça marche super aussi !! merci, mais pareil, comment faire si mot composé avec accent et espace ? merci
Il suffit que tu essayes, tu verras que ça ne change rien.
j'ai essayé mais ça ne fonctionne pas, si je fais
awk -F '="|"/' '/Hervé de Guébriant/ {x=1} x && /E85/ {print $5; x=0}' test.txt
, ça ne renvoi rien pourtant ça existe bien dans le fichier test.txt
Hors ligne
#19 Le 13/10/2019, à 19:02
- diesel
Re : isoler une donnée dans un texte avec 'sed awk grep" ou autre ?
pingouinux a écrit :sebastien29800 #12 a écrit :ça marche super aussi !! merci, mais pareil, comment faire si mot composé avec accent et espace ? merci
Il suffit que tu essayes, tu verras que ça ne change rien.
j'ai essayé mais ça ne fonctionne pas, si je fais
awk -F '="|"/' '/Hervé de Guébriant/ {x=1} x && /E85/ {print $5; x=0}' test.txt
, ça ne renvoi rien pourtant ça existe bien dans le fichier test.txt
Parce que je pense qu'il faut que tu "échappes" les espaces avec des "\" comme ça
awk -F '="|"/' '/Hervé\ de\ Guébriant/ {x=1} x && /E85/ {print $5; x=0}' test.txt
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 13/10/2019, à 19:03)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#20 Le 13/10/2019, à 19:09
- sebastien29800
Re : isoler une donnée dans un texte avec 'sed awk grep" ou autre ?
sebastien29800 a écrit :pingouinux a écrit :Il suffit que tu essayes, tu verras que ça ne change rien.
j'ai essayé mais ça ne fonctionne pas, si je fais
awk -F '="|"/' '/Hervé de Guébriant/ {x=1} x && /E85/ {print $5; x=0}' test.txt
, ça ne renvoi rien pourtant ça existe bien dans le fichier test.txt
Parce que je pense qu'il faut que tu "échappes" les espaces avec des "\" comme ça
awk -F '="|"/' '/Hervé\ de\ Guébriant/ {x=1} x && /E85/ {print $5; x=0}' test.txt
Amicalement.
Jean-Marie
merci
non toujours pareil, ça ne donne rien.....
Hors ligne
#21 Le 13/10/2019, à 19:15
- diesel
Re : isoler une donnée dans un texte avec 'sed awk grep" ou autre ?
Et que te donne
grep -n "Hervé de Guébriant" test.txt
[EDIT]
A la réflexion, je crois que c'est encore un problème d'encodage.
Ton système doit être en UTF8 et ton fichier est encodé en ISO-8859. Un "é" de ton fichier ne doit pas être reconnu comme un "é" par le système.
[/EDIT]
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 13/10/2019, à 19:20)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#22 Le 13/10/2019, à 19:36
- sebastien29800
Re : isoler une donnée dans un texte avec 'sed awk grep" ou autre ?
Et que te donne
grep -n "Hervé de Guébriant" test.txt
[EDIT]
A la réflexion, je crois que c'est encore un problème d'encodage.
Ton système doit être en UTF8 et ton fichier est encodé en ISO-8859. Un "é" de ton fichier ne doit pas être reconnu comme un "é" par le système.
[/EDIT]
Amicalement.
Jean-Marie
ça ne renvoie rien ............
Hors ligne
#23 Le 13/10/2019, à 19:37
- sebastien29800
Re : isoler une donnée dans un texte avec 'sed awk grep" ou autre ?
credenhill a écrit :que répond
file test.txt
XML 1.0 document, ISO-8859 text
Hors ligne
#24 Le 13/10/2019, à 19:52
- diesel
Re : isoler une donnée dans un texte avec 'sed awk grep" ou autre ?
Tu dois pouvoir convertir ton fichier en utf8 avec l'utilitaire convmv.
Après, tout fonctionnera.
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#25 Le 13/10/2019, à 20:02
- sebastien29800
Re : isoler une donnée dans un texte avec 'sed awk grep" ou autre ?
Tu dois pouvoir convertir ton fichier en utf8 avec l'utilitaire convmv.
Après, tout fonctionnera.
Amicalement.
Jean-Marie
convmv -f iso-8859-15 -t utf8 -r test.txt
Starting a dry run without changes...
No changes to your files done. Would have converted 0 files in 0 seconds.
Use --notest to finally rename the files.
Hors ligne