Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 ?

pingouinux a écrit :

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 ?

pingouinux a écrit :

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 ?

credenhill a écrit :

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 ?

diesel83140 a écrit :

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 ?

pingouinux a écrit :
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 ?

diesel83140 a écrit :

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 ?

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.

Hors ligne

#16 Le 13/10/2019, à 16:37

pingouinux

Re : isoler une donnée dans un texte avec 'sed awk grep" ou autre ?

sebastien29800 #9 a écrit :

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 ?

credenhill a écrit :

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 ?

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

Hors ligne

#19 Le 13/10/2019, à 19:02

diesel

Re : isoler une donnée dans un texte avec 'sed awk grep" ou autre ?

sebastien29800 a écrit :
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 ?

diesel83140 a écrit :
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 ?

diesel83140 a écrit :

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 ?

sebastien29800 a écrit :
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 ?

diesel83140 a écrit :

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