Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Saucissonner un fichier texte

39 réponses
Avatar
geo cherchetout
Bonjour,

J'ai un gros fichier texte dont certaines lignes commencent par la chaîne de
caractères zorglub. Parmi ces lignes, seules certaines sont immédiatement
précédées d'une ligne vide et je voudrais que chacune de ces lignes
particulières devienne le début d'un fichier élémentaire. Depuis hier je
fais des essais avec csplit et sed mais je ne parviens à rien de correct
parce que je ne sais pas écrire une expression rationnelle portant sur
plusieurs lignes. Exemple :

$ csplit monfichier '/^&^zorglub/' {*}
950745

L'unique fichier produit est identique à mon fichier original :-/

Quelqu'un a sûrement une solution ?

10 réponses

1 2 3 4
Avatar
Luc.Habert.00__arjf
JKB :

Disons que je ne vois pas l'intérêt de perl par rapport à awk dans
le cas présent...



Ça peut meme se faire en shell.

I=0
next_chunk () {
exec > chunk."$I"
I=`expr "$I" + 1`
}

PREV_LINE_EMPTY
next_chunk

while read -r L; do
CUT=$PREV_LINE_EMPTY
PREV_LINE_EMPTY case "$L" in
'') PREV_LINE_EMPTY=t;;
zorglub*)
if test -n "$CUT"; then nextchunk; fi;;
esac
printf '%sn' "$L"
done
Avatar
geo cherchetout
Le 11/05/2011 21:14, *Luc Habert* a écrit fort à propos :

Ça peut meme se faire en shell.

I=0
next_chunk () {
exec > chunk."$I"
I=`expr "$I" + 1`
}

PREV_LINE_EMPTY >
next_chunk

while read -r L; do
CUT=$PREV_LINE_EMPTY
PREV_LINE_EMPTY > case "$L" in
'') PREV_LINE_EMPTY=t;;
zorglub*)
if test -n "$CUT"; then nextchunk; fi;;
esac
printf '%sn' "$L"
done




Je suppose que je dois mettre ça dans un script (dekoup.sh) que je rendrai
exécutable, mais quelle syntaxe pour l'employer ?

$ dekoup.sh monfichier ?
Avatar
Luc.Habert.00__arjf
geo cherchetout :

$ dekoup.sh monfichier ?



dekoup.sh < monfichier
Avatar
geo cherchetout
Le 11/05/2011 22:22, *Luc Habert* a écrit fort à propos :

dekoup.sh < monfichier



Y'a apparemment un petit truc qui coince :

$ dekoup.sh < monfichier
bash: /home/gerard/bin/dekoup.sh : bin/bash : mauvais interpréteur: Aucun
fichier ou dossier de ce type
Avatar
Loki Harfagr
Wed, 11 May 2011 21:50:57 +0200, geo cherchetout did cat :

Le 11/05/2011 20:22, *Loki Harfagr* a écrit fort à propos :

$ awk '/^$/{a=1}a&&/^zorglub /{a=0;print > ++B}' grofichiet

ou encore :
$ awk '/^$/{a=1}a&&/^zorglub /{a=0;print > "tralala"++B}' grofichiet



Hélas, les deux commandes se terminent presque instantanément sans
message d'erreur mais aucun fichier n'est produit.



étrange, surtout s'il n'y a pas de message d'erreur (en général indice
d'un problème de quotes ou d'appariage de {( :-)

peux-tu tester avec mon jeu d'essai et si ça fonctionne avec mais
pas avec ton propre fichier ce sera que j'ai mal capté la description initiale
ou que ton fichier contient des cas amusants (auquel cas ce serait bien que
tu postes une partie de ton fichier ou ton propre jeu d'essai :-)

voilà le "gros fichier" à saucissoner :
----------
$ cat toto
bla bla bla
zorglub pas bien
bla bla bla
bla bla bla

zorglub bien 1
bla bla bla
bla bla bla
bla bla bla
bla bla bla
zorglub pas bien
bla bla bla
bla bla bla
pas bon zorglub bulgroz
zorglub pas bien
bla bla bla
bla bla bla
bla bla bla
zorglub pas bien
zorglub pas bien

zorglub bien 2
zorglub pas bien
bla bla bla

bla bla bla
bla bla bla

bla bla bla
bla bla bla
bla bla bla

zorglub bien 3
zorglub pas bien
bla bla bla
bla bla bla

zorglub bien 4

zorglub bien 5
glop glop glop
finfinfin
----------

et après exécution de :
----------
$ awk '/^$/{a=1}a&&$1=="zorglub"{a=0;print > "tralala"++B}' toto
----------

Nous avons 5 fichiers "sortie" :
----------
$ wc tralala*
1 3 15 tralala1
1 3 15 tralala2
1 3 15 tralala3
1 3 15 tralala4
1 3 15 tralala5
5 15 75 total
----------

Par exemple :
----------
$ cat tralala3
zorglub bien 3
----------

Voilà, à vous, les studios ;-)
Avatar
Loki Harfagr
Wed, 11 May 2011 20:45:18 +0000, Loki Harfagr did cat :

Wed, 11 May 2011 21:50:57 +0200, geo cherchetout did cat :

Le 11/05/2011 20:22, *Loki Harfagr* a écrit fort à propos :

$ awk '/^$/{a=1}a&&/^zorglub /{a=0;print > ++B}' grofichiet

ou encore :
$ awk '/^$/{a=1}a&&/^zorglub /{a=0;print > "tralala"++B}' grofichiet



Hélas, les deux commandes se terminent presque instantanément sans
message d'erreur mais aucun fichier n'est produit.



étrange, surtout s'il n'y a pas de message d'erreur (en général indice
d'un problème de quotes ou d'appariage de {( :-)

peux-tu tester avec mon jeu d'essai et si ça fonctionne avec mais pas
avec ton propre fichier ce sera que j'ai mal capté la description
initiale ou que ton fichier contient des cas amusants (auquel cas ce
serait bien que tu postes une partie de ton fichier ou ton propre jeu
d'essai :-)

voilà le "gros fichier" à saucissoner : ----------
$ cat toto
bla bla bla
zorglub pas bien
bla bla bla
bla bla bla

zorglub bien 1
bla bla bla
bla bla bla
bla bla bla
bla bla bla
zorglub pas bien
bla bla bla
bla bla bla
pas bon zorglub bulgroz
zorglub pas bien
bla bla bla
bla bla bla
bla bla bla
zorglub pas bien
zorglub pas bien

zorglub bien 2
zorglub pas bien
bla bla bla

bla bla bla
bla bla bla

bla bla bla
bla bla bla
bla bla bla

zorglub bien 3
zorglub pas bien
bla bla bla
bla bla bla

zorglub bien 4

zorglub bien 5
glop glop glop
finfinfin
----------

et après exécution de :
----------
$ awk '/^$/{a=1}a&&$1=="zorglub"{a=0;print > "tralala"++B}' toto
----------

Nous avons 5 fichiers "sortie" :
----------
$ wc tralala*
1 3 15 tralala1
1 3 15 tralala2
1 3 15 tralala3
1 3 15 tralala4
1 3 15 tralala5
5 15 75 total
----------

Par exemple :
----------
$ cat tralala3
zorglub bien 3
----------

Voilà, à vous, les studios ;-)



Et, à voir la version de Luc Habert (attention à mettre une bang line
correcte pour ton environnement et corriger la typo nextchunk/next_chunk)
en voici l'équivalent probable
(en tous cas avec mon jeu d'essai ça l'est :D) :
$ awk '/^$/{a=NR}/^zorglub /&&a==(NR-1){++B} { print > "trilili"B}' toto
Avatar
Luc.Habert.00__arjf
geo cherchetout :

bash: /home/gerard/bin/dekoup.sh : bin/bash : mauvais interpréteur: Aucun
fichier ou dossier de ce type



Je pense que tu as mis

#!bin/bash

en tête du fichier... Mets plutot

#!/bin/sh
Avatar
Luc.Habert.00__arjf
Loki Harfagr :

corriger la typo nextchunk/next_chunk)



Très juste. Ça m'apprendra à tester avant de poster.
Avatar
geo cherchetout
Le 11/05/2011 23:36, *Luc Habert* a écrit fort à propos :

Je pense que tu as mis

#!bin/bash

en tête du fichier... Mets plutot

#!/bin/sh



J'avais essayé mais avec le même résultat.
Avatar
geo cherchetout
Le 11/05/2011 23:37, *Luc Habert* a écrit fort à propos :
Loki Harfagr :

corriger la typo nextchunk/next_chunk)



Très juste. Ça m'apprendra à tester avant de poster.



J'aurais du voir l'erreur moi-même. Mais même après correction le message
d'erreur est le même.
Trop fatigué ce soir, à demain pour la suite de l'aventure.
1 2 3 4