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
moi-meme
Le Wed, 11 May 2011 15:50:29 +0200, geo cherchetout a écrit :

Quelqu'un a sûrement une solution ?



gratuite (juste une proposition)
perl ?
Avatar
DeVice
On 11/05/2011 15:50, geo cherchetout wrote:
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 ?



Pas testé avec csplit, mais le caractère retour à la ligne est généré
par l’enchaînement de touches CTRL+v suivi de CTRL+SHIFT+M et s'affiche
comme '^M' (dans un terminal en tout cas).

Si ça marche, tant mieux, sinon ça pourra servir ailleurs :)

--
/eviv/bulgroz
Avatar
geo cherchetout
Le 11/05/2011 16:55, *moi-meme* a écrit fort à propos :

gratuite (juste une proposition)
perl ?



Oui, merci, l'idée est probablement excellente mais je ne sais pas
m'exprimer dans ce langage. Si ça inspire quelqu'un, je saurai utiliser un
script tout fait accompagné de son mode d'emploi...
Avatar
geo cherchetout
Le 11/05/2011 17:11, *DeVice* a écrit fort à propos :

Pas testé avec csplit, mais le caractère retour à la ligne est généré
par l’enchaînement de touches CTRL+v suivi de CTRL+SHIFT+M et s'affiche
comme '^M' (dans un terminal en tout cas).

Si ça marche, tant mieux, sinon ça pourra servir ailleurs :)



$ csplit monfichier '/^M^Mzorglub/' {*}
950745

Même résultat, hélas. Merci quand-même, ma culture s'est notablement accrue. :-)
Avatar
JKB
Le Wed, 11 May 2011 17:11:15 +0200,
DeVice écrivait :
On 11/05/2011 15:50, geo cherchetout wrote:
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 ?



Pas testé avec csplit, mais le caractère retour à la ligne est généré
par l’enchaînement de touches CTRL+v suivi de CTRL+SHIFT+M et s'affiche
comme '^M' (dans un terminal en tout cas).

Si ça marche, tant mieux, sinon ça pourra servir ailleurs :)



Je ne suis pas sûr que ça fonctionne, mais la meilleure solution
pour faire ce genre de chose, c'est awk. Là, tout de suite, je n'ai
pas le temps de faire, mais ça me semble assez trivial.

Cordialement,

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
Patrick Texier
Le Wed, 11 May 2011 16:07:50 +0000 (UTC), JKB a écrit :

Je ne suis pas sûr que ça fonctionne, mais la meilleure solution
pour faire ce genre de chose, c'est awk. Là, tout de suite, je n'ai
pas le temps de faire, mais ça me semble assez trivial.




Je ne vois pas l'intérêt de awk par rapport à Perl, bien plus portable
et puissant.

Sinon même réponse.
--
Patrick Texier

vim:syntax=mail:ai:ts=4:et:twr
Avatar
Loki Harfagr
Wed, 11 May 2011 16:07:50 +0000, JKB did cat :

Le Wed, 11 May 2011 17:11:15 +0200,
DeVice écrivait :
On 11/05/2011 15:50, geo cherchetout wrote:
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 ?



Pas testé avec csplit, mais le caractère retour à la ligne est généré
par l’enchaînement de touches CTRL+v suivi de CTRL+SHIFT+M et s'affiche
comme '^M' (dans un terminal en tout cas).

Si ça marche, tant mieux, sinon ça pourra servir ailleurs :)



Je ne suis pas sûr que ça fonctionne, mais la meilleure solution pour
faire ce genre de chose, c'est awk. Là, tout de suite, je n'ai pas le
temps de faire, mais ça me semble assez trivial.

Cordialement,

JKB



Je ne suis pas certain d'avoir cerné tout l'énoncé mais voici une piste possible :
$ awk '/^$/{a=1}a&&$1=="zorglub"{a=0;print}' grofichiet

Si "zorglub" est une facilité de langage voilà plus libre :
$ awk '/^$/{a=1}a&&/^zorglub /{a=0;print}' grofichiet

la même chose est bien sûr possible en perl mais pourquoi en arriver à de
pareilles extrêmités ;-)
Avatar
Loki Harfagr
Wed, 11 May 2011 18:18:18 +0000, Loki Harfagr did cat :

Wed, 11 May 2011 16:07:50 +0000, JKB did cat :

Le Wed, 11 May 2011 17:11:15 +0200,
DeVice écrivait :
On 11/05/2011 15:50, geo cherchetout wrote:
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 ?



Pas testé avec csplit, mais le caractère retour à la ligne est généré
par l’enchaînement de touches CTRL+v suivi de CTRL+SHIFT+M et
s'affiche comme '^M' (dans un terminal en tout cas).

Si ça marche, tant mieux, sinon ça pourra servir ailleurs :)



Je ne suis pas sûr que ça fonctionne, mais la meilleure solution pour
faire ce genre de chose, c'est awk. Là, tout de suite, je n'ai pas le
temps de faire, mais ça me semble assez trivial.

Cordialement,

JKB



Je ne suis pas certain d'avoir cerné tout l'énoncé mais voici une piste
possible : $ awk '/^$/{a=1}a&&$1=="zorglub"{a=0;print}' grofichiet

Si "zorglub" est une facilité de langage voilà plus libre :
$ awk '/^$/{a=1}a&&/^zorglub /{a=0;print}' grofichiet

la même chose est bien sûr possible en perl mais pourquoi en arriver à
de
pareilles extrêmités ;-)



je soupçonne avoir omis de parler de l'export vers les "fichiers élémentaires" :D)

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

ou encore :
$ awk '/^$/{a=1}a&&/^zorglub /{a=0;print > "tralala"++B}' grofichiet
Avatar
JKB
Le Wed, 11 May 2011 18:40:54 +0200,
Patrick Texier écrivait :
Le Wed, 11 May 2011 16:07:50 +0000 (UTC), JKB a écrit :

Je ne suis pas sûr que ça fonctionne, mais la meilleure solution
pour faire ce genre de chose, c'est awk. Là, tout de suite, je n'ai
pas le temps de faire, mais ça me semble assez trivial.




Je ne vois pas l'intérêt de awk par rapport à Perl, bien plus portable
et puissant.

Sinon même réponse.



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

JKB

--
Si votre demande me parvient sur carte perforée, je titiouaillerai très
volontiers une réponse...
=> http://grincheux.de-charybde-en-scylla.fr
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
1 2 3 4