#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,
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
Il existe un tunnel obscur dans la lumière infinie. Lao-Tseu
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 -_-
Il existe un tunnel obscur dans la lumière infinie. Lao-Tseu
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
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
Hors ligne
#14 Le 17/09/2020, à 23:13
- diesel
Re : Lecture de fichier par paragraphe
# Diesel
pour moi un paragraphe est une delimitation de chaine de caracteres dans un texte global
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
@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
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é
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