Saucissonner un fichier texte

Le
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 ?
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 4
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
moi-meme
Le #23351371
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 ?
DeVice
Le #23351431
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
geo cherchetout
Le #23351491
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...
geo cherchetout
Le #23351581
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. :-)
JKB
Le #23351611
Le Wed, 11 May 2011 17:11:15 +0200,
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 :)



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
Patrick Texier
Le #23351991
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
Loki Harfagr
Le #23352161
Wed, 11 May 2011 16:07:50 +0000, JKB did cat :

Le Wed, 11 May 2011 17:11:15 +0200,
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 :)



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 ;-)
Loki Harfagr
Le #23352151
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
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
JKB
Le #23352141
Le Wed, 11 May 2011 18:40:54 +0200,
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.



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
Luc.Habert.00__arjf
Le #23352241
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
Publicité
Poster une réponse
Anonyme