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 17/09/2020, à 08:34

maiden65

Lecture de fichier par paragraphe

Bonjour à Tous,

Je viens vers vous car je voudrais extraire une chaine de caractere (1 paragraphe) d'un fichier

Exemple :
fichier = toto.txt
contenu du fichier

<begin>
blablabla
blablabla
<end>
<begin>
blobloblo
blobloblo
<end>
..... et ainsi de suite

je voudrais prendre ces "paragraphes" 1 par 1 et les mettre dans une variable ou un fichier pour traitement spécifique.
J'ai tenté par" awk" et par "expr match" mais je n'y arrive pas j'ai des erreurs de syntaxe.
Quelqu'un peut-il me dépanner svp ?
C'est pour le traitement d'un fichier de log.
Merci d'avance

Hors ligne

#2 Le 17/09/2020, à 08:46

diesel

Re : Lecture de fichier par paragraphe

C'est quoi un "paragraphe" pour toi dans l'exemple que tu nous donnes ?

Ou dit autrement, tu voudrais que ça te sorte quoi ?

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

#3 Le 17/09/2020, à 09:29

pingouinux

Re : Lecture de fichier par paragraphe

Bonjour,

maiden65 #1 a écrit :

J'ai tenté par" awk" et par "expr match" mais je n'y arrive pas j'ai des erreurs de syntaxe.

Peux-tu déjà montrer ce que tu as tenté, et les messages d'erreur ?

Hors ligne

#4 Le 17/09/2020, à 09:58

sputnick

Re : Lecture de fichier par paragraphe

Voici comment je ferais:

$ cat /tmp/l
<begin>
blablabla
blablabla
<end>
<begin>
blobloblo
blobloblo
<end>
<begin>
foo
bar
base
<end>
$ awk '$1=="<begin>"{f=1;++c;next} $1=="<end>"{f=0} f{print > "/tmp/p"c}' /tmp/l
$ cat /tmp/p1
blablabla
blablabla

On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#5 Le 17/09/2020, à 10:36

maiden65

Re : Lecture de fichier par paragraphe

# Diesel
pour moi un paragraphe est une delimitation de chaine de caracteres  dans un texte global

#pingouinux
voici mes commandes testées avec AWK

awk '/^<begin>/ { f=1; nf=++; next} /^<end>/ { f=0 } { if (f) print > "f-" nf; } ' < actif_1.txt
awk: ligne de commande:1: /^<begin>/ { f=1; nf=++; next} /^<end>/ { f=0 } { if (f) print > "f-" nf; } 
awk: ligne de commande:1:                        ^ syntax error
root@po-laurent:~/NUMEROLOGIE/travail/nbr_actif# awk '/<begin>/ { f=1; nf=++; next} /<end>/ { f=0 } { if (f) print > "f-" nf; } ' < actif_1.txt
awk: ligne de commande:1: /<begin>/ { f=1; nf=++; next} /<end>/ { f=0 } { if (f) print > "f-" nf; } 
awk: ligne de commande:1:                       ^ syntax error
root@po-laurent:~/NUMEROLOGIE/travail/nbr_actif# cat  actif_1.txt | awk '/<begin>/ { f=1; nf=++; next} /<end>/ { f=0 } { if (f) print > "f-" nf; } '
aawk: ligne de commande:1: /^<begin>/ { f=1; nf=++; next} /^<end>/ { f=0 } { if (f) print > "f-" nf; } 
awk: ligne de commande:1:                        ^ syntax error
root@po-laurent:~/NUMEROLOGIE/travail/nbr_actif# awk '/<begin>/ { f=1; nf=++; next} /<end>/ { f=0 } { if (f) print > "f-" nf; } ' < actif_1.txt
awk: ligne de commande:1: /<begin>/ { f=1; nf=++; next} /<end>/ { f=0 } { if (f) print > "f-" nf; } 
awk: ligne de commande:1:                       ^ syntax error
root@po-laurent:~/NUMEROLOGIE/travail/nbr_actif# cat  actif_1.txt | awk '/<begin>/ { f=1; nf=++; next} /<end>/ { f=0 } { if (f) print > "f-" nf; } '
awk: ligne de commande:1: /<begin>/ { f=1; nf=++; next} /<end>/ { f=0 } { if (f) print > "f-" nf; } 
awk: ligne de commande:1:                       ^ syntax error
wk: ligne de commande:1: /<begin>/ { f=1; nf=++; next} /<end>/ { f=0 } { if (f) print > "f-" nf; } 
awk: ligne de commande:1:                       ^ syntax error

#sputnick
Je teste et te tient au courant

Hors ligne

#6 Le 17/09/2020, à 10:39

sputnick

Re : Lecture de fichier par paragraphe

Évite de tester des trucs (avec redirections de fichiers) en root -_-


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#7 Le 17/09/2020, à 10:53

maiden65

Re : Lecture de fichier par paragraphe

#sputnick
Je viens de tester (en user simple) et avec ton exemple de fichier ==> à la sortie j'ai bien 3 fichiers contenant chacun le texte entre chaque balises.
Par contre quand je fait la même commande avec mon fichier, je n'ai aucune erreur ==> mais je n'ai aucun fichier p? qui se créé. Je ne crois pas qu'il y ait un mode verbose dans le AWK comme dans les scripts shell par exemple. Ce qui fait que je ne vois pas ou il y a un problème.

Hors ligne

#8 Le 17/09/2020, à 11:06

pingouinux

Re : Lecture de fichier par paragraphe

maiden65 #5 a écrit :

voici mes commandes testées avec AWK

awk '/^<begin>/ { f=1; nf=++; next} /^<end>/ { f=0 } { if (f) print > "f-" nf; } ' < actif_1.txt

Il faut remplacer nf=++ par nf++, et le résulttat est bon avec ton exemple.

awk '/^<begin>/ { f=1; nf++; next} /^<end>/ { f=0 } { if (f) print > "f-" nf; } ' toto.txt

Par contre quand je fait la même commande avec mon fichier, je n'ai aucune erreur ==> mais je n'ai aucun fichier p?

Il faudrait voir à quoi ressemble ce fichier.

Hors ligne

#9 Le 17/09/2020, à 11:22

maiden65

Re : Lecture de fichier par paragraphe

J'ai trouvé !!!
en fait dans le fichier il y a \r\n comme retour chariot.
Une fois que j'ai fait

tr -d '\r' < actif_1.txt > lolo
awk '$1=="<begin>"{f=1;++c;next} $1=="<end>"{f=0} f{print > "/tmp/p"c}' lolo

J'ai bien mes fichiers

-rw-rw-r-- 1 laurent laurent   44 sept. 17 12:15 p4
-rw-rw-r-- 1 laurent laurent  468 sept. 17 12:15 p3
-rw-rw-r-- 1 laurent laurent  982 sept. 17 12:15 p2
-rw-rw-r-- 1 laurent laurent 1265 sept. 17 12:15 p1

Maintenant je vais être encore un peut 'lourdingue', mais je voudrais que mes fichiers portent un nom specifique. Ex : traitement_auto , traitement_job, traitement_script etc.....
dois-je passer par un script shell ? et si oui comment le faire ?

Hors ligne

#10 Le 17/09/2020, à 13:27

pingouinux

Re : Lecture de fichier par paragraphe

je voudrais que mes fichiers portent un nom specifique.

Ceci, en adaptant un peu la commande ci-dessus ?

awk -v p=traitement_auto '$1=="<begin>"{f=1;++c;next} $1=="<end>"{f=0} f{print > "/tmp/tst/"p"-"c}' toto.txt

Dernière modification par pingouinux (Le 17/09/2020, à 13:29)

Hors ligne

#11 Le 17/09/2020, à 13:50

maiden65

Re : Lecture de fichier par paragraphe

En fait cette nouvelle commande n'est pas completement differente de la précédente. elle me permet de mieux nommer les fichiers.
Mais en fait mon résultat attendu serait

-rw-rw-r-- 1 laurent laurent   44 sept. 17 14:41 traitement_auto
-rw-rw-r-- 1 laurent laurent  468 sept. 17 14:41 log_script
-rw-rw-r-- 1 laurent laurent  982 sept. 17 14:41 error_job

voici un exemple de ce que j'attend

Car en fait les traitements retournent les infos en plusieurs sections.

Si ce n'est pas possible en commande AWK cela est-il realisable en script shell avec passage de parametre ?

Hors ligne

#12 Le 17/09/2020, à 14:46

pingouinux

Re : Lecture de fichier par paragraphe

Il faudrait déjà que tu précises ce que tu veux, car dans le fichier exemple en #1, il n'y a rien qui correspond à un titre.
Où récupères-tu ces titres ? traitement_auto, log_script, error_job

Hors ligne

#13 Le 17/09/2020, à 14:59

maiden65

Re : Lecture de fichier par paragraphe

En fait chaque fichier de log contient au moins 3 parties
1- traitement auto ou manuel
2- log du traitement
3- message d'erreur rencontré
4- sortie d'information du traitement (date debut/fin)

donc cela pourrait etre

<begin>
auto
<end>
<begin>
execution du traitement avec les sorties attendues
<end>
<begin>
message d'erreur rencontré s'il y en a un sinon vide
<end>
<begin>
date debut : jj/mm/aaa hh:mm:ss
date fin : jj/mm/aaa hh:mm:ss

J'aimerais donc découper ce fichier afin de pouvoir faire des études et stats

J'espère que j'ai pu être plus clair hmm

Hors ligne

#14 Le 17/09/2020, à 23:13

diesel

Re : Lecture de fichier par paragraphe

maiden65 a écrit :

# Diesel
pour moi un paragraphe est une delimitation de chaine de caracteres  dans un texte global

lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol lol

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

#15 Le 18/09/2020, à 06:18

pingouinux

Re : Lecture de fichier par paragraphe

@maiden65 #13 :
Le mieux serait que tu donnes un exemple concret de fichier de départ, ainsi que les noms et les contenus des fichiers que tu veux créer.

Hors ligne

#16 Le 18/09/2020, à 17:08

maiden65

Re : Lecture de fichier par paragraphe

@Diesel ==> si c'est pour cela, l'abstention aurait été une bonne chose.

@pingouinux : désolé pour le retard de réponse, je n'ai pas eu le temps de voir le jour depuis hier. Je prépare un fichier sans données et te le fourni d'ici lundi ==> et encore merci

Hors ligne

#17 Le 18/09/2020, à 18:17

diesel

Re : Lecture de fichier par paragraphe

maiden65 a écrit :

@Diesel ==> si c'est pour cela, l'abstention aurait été une bonne chose.

Relis mon premier post. Si c'est pour nous faire la réponse que tu nous as faite, l'abstention aurait été une bonne chose (aussi).

Amicalement.

Jean-Marie

Dernière modification par diesel (Le 18/09/2020, à 19:02)


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

#18 Le 21/09/2020, à 07:54

maiden65

Re : Lecture de fichier par paragraphe

@pingouinux
voici un exemple épuré et raccourci d'un fichier

<begin>
auto  ==> type de traitement. 
<end>
<begin>
This response was from IP 192.168.1.16, reporting an IP address of 192.168.1.16.
query_name_response: Multiple (2) responses received for a query on subnet 192.168.1.14 for name WORKGROUP<1d>.
STATUS=daemon 'smbd' finished starting up and ready to serve connections
<end>
<begin>
log.192.168.1.11:  read_fd_with_timeout failed for client 192.168.1.11 read error = NT_STATUS_END_OF_FILE.log.
<begin>
date debut : 19/09/2020 06:16:28
date fin : 19/09/2020 06:48:36
<end>

le nom de chaque fichier correspond au traitement fait. Ce que je souhaite faire, c'est prendre chaque infos entre chaque balise begin/end , et de les mettre dans un fichier dont le nom serait job-type.txt , job-log.txt, job-error.txt, job-duree.txt.
Cela semble lourd, mais les traitements datent d'un temps ancien et dès que l'on y touche ca créer des anomalies. Je voudrait donc faire une analyse des "données" et tenter de résoudre des problèmes en amont. La refonte des scripts avait été dans les tuyaux mais est mis en suspend. Je me vois donc obliger de tenter de faire cette opération.

donc en conclusion il me faudrait la sortie des noms de fichiers job-type.txt , job-log.txt, job-error.txt, job-duree.txt. ou job est un nom de variable que je passerais dans le script sh.

Merci d'avance

Hors ligne

#19 Le 21/09/2020, à 08:44

diesel

Re : Lecture de fichier par paragraphe

Enfin, on a fini par apprendre ce que sont les "paragraphes" dans ce cas de figure. Encore que...

Quand tu écris : "chaque info entre chaque balise begin/end", je crois qu'il faut comprendre "tous les caractères entre chaque couple de balises begin/end".

Par contre, je n'ai pas bien saisi l'histoire des noms de fichiers de sortie.

En l'état actuel, je ne vois pas comment ton script pourrait sélectionner tout ou partie des "paragraphes". Finalement, tout ce que tu pourras obtenir est la suppression des lignes contenant, soit "<begin>", soit "<end>.

Alors, un

grep -v "<begin>" fichier-d'entrée | grep -v "<end>" >job-type.txt

par exemple devrait faire l'affaire.

Ou alors, je n'ai rien compris...

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

#20 Le 21/09/2020, à 09:39

maiden65

Re : Lecture de fichier par paragraphe

@diesel
la commande

grep -v "<begin>" fichier-d'entrée | grep -v "<end>" >job-type.txt

ne fait que supprimer les "balises" et met tout dans un même fichier.
Ce que je souhaite s'est d'avoir 1 fichier par par balise.

Hors ligne

#21 Le 21/09/2020, à 10:23

diesel

Re : Lecture de fichier par paragraphe

maiden65 a écrit :

Ce que je souhaite s'est d'avoir 1 fichier par balise.

Ah !

Ben, je crois que je ne suis pas le seul à ne pas avoir compris ça.

Donc, tu veux un script interactif qui, "paragraphe" par "paragraphe" te présente le contenu du "paragraphe" et attend que tu lui indiques le nom du fichier dans lequel le ranger ?

Et est-ce que tu veux un fichier de sortie différent pour chaque "paragraphe" ou pouvoir ajouter un "paragraphe" à la fin d'un fichier contenant déjà des "paragraphes" du même type ?

Et tes fichiers "source", ils sont longs ?

Amicalement.

Jean-Marie

Dernière modification par diesel (Le 21/09/2020, à 10:37)


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 21/09/2020, à 11:06

pingouinux

Re : Lecture de fichier par paragraphe

Il manque un <end> dans ton exemple en #18.
Tu peux essayer ceci, qui doit pouvoir se simplifier :

awk -v p=nom_choisi 'BEGIN{nom[1]="type";nom[2]="log";nom[3]="error";nom[4]="duree"}$1=="<begin>"{f=1;++c;next} $1=="<end>"{f=0} f{print > "/tmp/tst/"p"-"nom[c]".txt"}' toto.txt

Édité :
Simplification

awk -v p=nom_choisi 'BEGIN{split("type log error duree",nom)}$1=="<begin>"{f=1;++c;next} $1=="<end>"{f=0} f{print > "/tmp/tst/"p"-"nom[c]".txt"}' toto.txt

Dernière modification par pingouinux (Le 21/09/2020, à 20:09)

Hors ligne

#23 Le 25/09/2020, à 08:49

maiden65

Re : Lecture de fichier par paragraphe

@pingouinux

UN GRAND MERCI.... c'est ce que je voulais. Mettre les parties dans des tableaux ne m'avait pas effleuré l'esprit ( c'est surtout que je ne maîtrise par trop cela).

J'ai bien mes fichiers et ils contiennent les données attendues.
Je dois préciser que cela fonctionne qu'avec un retour chariot \n et non \r\n. Il me faut donc faire la suppression des \r avant puis passer le awk sur le fichier intermédiaire et temporaire.
Ce n'est pas grave, car c'est pour permettre des analyses. Quand la refonte sera d'actualité ce sera du passé big_smile

Encore MERCI.

Hors ligne

#24 Le 25/09/2020, à 10:29

pingouinux

Re : Lecture de fichier par paragraphe

Pour utiliser directement un fichier dont les lignes se terminent par '\r\n' :

Pour que les lignes des fichiers créés se terminent par \n :

awk -v p=nom_choisi 'BEGIN{split("type log error duree",nom)}{sub("\r","")}$1=="<begin>"{f=1;++c;next} $1=="<end>"{f=0} f{print > "/tmp/tst/"p"-"nom[c]".txt"}' toto.txt

Pour que les lignes des fichiers créés se terminent par \r\n :

awk -v p=nom_choisi 'BEGIN{split("type log error duree",nom)}$1=="<begin>\r"{f=1;++c;next} $1=="<end>\r"{f=0} f{print > "/tmp/tst/"p"-"nom[c]".txt"}' toto.txt

Hors ligne