OVH Cloud OVH Cloud

supprimer des lignes d'après une expression

9 réponses
Avatar
kevin
Bonjour

Comment puis-je, dans un fichier texte, supprimer automatiquement une ligne
si elle contient l'expression 'toto' ?

merci

ps : c'est un gros fichier (3Go)

9 réponses

Avatar
Marc Boyer
Le 26-02-2007, kevin a écrit :
Comment puis-je, dans un fichier texte, supprimer automatiquement une ligne
si elle contient l'expression 'toto' ?


grep -v

ps : c'est un gros fichier (3Go)


Faut prendre son temps...
Plus sérieusement, ça dépend si tu as 3Go de libre ou pas.
Si tu as 3Go de libre:
grep -v toto GrosFichier > GrosFichierSansToto

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. André Maurois)

Avatar
Stephane Chazelas
2007-02-26, 15:48(+00), Marc Boyer:
Le 26-02-2007, kevin a écrit :
Comment puis-je, dans un fichier texte, supprimer automatiquement une ligne
si elle contient l'expression 'toto' ?


grep -v

ps : c'est un gros fichier (3Go)


Faut prendre son temps...
Plus sérieusement, ça dépend si tu as 3Go de libre ou pas.
Si tu as 3Go de libre:
grep -v toto GrosFichier > GrosFichierSansToto


Et sinon:

perl -ne 'print unless /toto/;
END{truncate STDOUT, tell STDOUT}
' < GrosFichier 1<> GrosFichier

--
Stéphane


Avatar
kevin
Stephane Chazelas sur fr.comp.os.unix le mardi 27 février 2007 12:01

2007-02-26, 15:48(+00), Marc Boyer:
Le 26-02-2007, kevin a écrit :
Comment puis-je, dans un fichier texte, supprimer automatiquement une
ligne si elle contient l'expression 'toto' ?


grep -v

ps : c'est un gros fichier (3Go)


Faut prendre son temps...
Plus sérieusement, ça dépend si tu as 3Go de libre ou pas.
Si tu as 3Go de libre:
grep -v toto GrosFichier > GrosFichierSansToto


Et sinon:

perl -ne 'print unless /toto/;
END{truncate STDOUT, tell STDOUT}
' < GrosFichier 1<> GrosFichier



merci à vous deux



Avatar
Jean-Rene David
* Stephane Chazelas [2007.02.27 11:01]:
perl -ne 'print unless /toto/;
END{truncate STDOUT, tell STDOUT}
' < GrosFichier 1<> GrosFichier


Si je comprend bien, on utilise "1<>" plutôt que ">" pour
éviter que "GrosFichier" soit tronqué avant que la lecture
ne commence.

Mais est-ce que ça marche seulement dans le cas particulier
où on retranche des lignes? Peut-on toujours être sûr que la
lecture précède l'écriture?

--
JR

Avatar
Stephane Chazelas
2007-03-02, 09:10(-06), Jean-Rene David:
* Stephane Chazelas [2007.02.27 11:01]:
perl -ne 'print unless /toto/;
END{truncate STDOUT, tell STDOUT}
' < GrosFichier 1<> GrosFichier


Si je comprend bien, on utilise "1<>" plutôt que ">" pour
éviter que "GrosFichier" soit tronqué avant que la lecture
ne commence.

Mais est-ce que ça marche seulement dans le cas particulier
où on retranche des lignes? Peut-on toujours être sûr que la
lecture précède l'écriture?


Oui, ca ne marche seulement que quand ce qu'on ecrit est moins
gros que ce qu'on lit (ou aussi gros).

On pourra s'en tirer toutefois dans le cas contraire si le
fichier est moins gros que ce que perl lit en un coup
(probablement une page souvent 4096 octets).

--
Stéphane


Avatar
Nicolas George
Jean-Rene David wrote in message
:
Peut-on toujours être sûr que la
lecture précède l'écriture?


Si ce qui est écrit dépend de ce qui est lu, il y a des chances, oui, à
moins d'avoir inventé le programme à remonter le temps.

Avatar
Jean-Rene David
* Nicolas George [2007.03.02 16:51]:
Jean-Rene David wrote in message
:
Peut-on toujours être sûr que la
lecture précède l'écriture?


Si ce qui est écrit dépend de ce qui est lu, il y a des chances, oui, à
moins d'avoir inventé le programme à remonter le temps.


Ouais bon.

Le fait que "ce qui est écrit dépend de ce qui est lu" est
propre à la question particulière de l'OP, et même ça ne
garanti pas qu'on écrira toujours moins ou autant que ce
qu'on lit.

Ma question portait sur l'utilisation de la construction
"< fichier 1<>fichier" en général.

--
JR


Avatar
Michel Billaud
Stephane Chazelas writes:

2007-02-26, 15:48(+00), Marc Boyer:
Le 26-02-2007, kevin a écrit :
Comment puis-je, dans un fichier texte, supprimer automatiquement une ligne
si elle contient l'expression 'toto' ?


grep -v
...


Plus sérieusement, ça dépend si tu as 3Go de libre ou pas.
Si tu as 3Go de libre:
grep -v toto GrosFichier > GrosFichierSansToto


Et sinon:

perl -ne 'print unless /toto/;
END{truncate STDOUT, tell STDOUT}
' < GrosFichier 1<> GrosFichier


Tout de suite les gros mots..
sed -i /toto/d Grosfichier

MB

--
Michel BILLAUD
LABRI-Université Bordeaux I tel 05 4000 6922 / 05 5684 5792
351, cours de la Libération http://www.labri.fr/~billaud
33405 Talence (FRANCE)



Avatar
Stephane Chazelas
2007-03-11, 10:42(+01), Michel Billaud:
Stephane Chazelas writes:

2007-02-26, 15:48(+00), Marc Boyer:
Le 26-02-2007, kevin a écrit :
Comment puis-je, dans un fichier texte, supprimer automatiquement une ligne
si elle contient l'expression 'toto' ?


grep -v
...


Plus sérieusement, ça dépend si tu as 3Go de libre ou pas.
Si tu as 3Go de libre:
grep -v toto GrosFichier > GrosFichierSansToto


Et sinon:

perl -ne 'print unless /toto/;
END{truncate STDOUT, tell STDOUT}
' < GrosFichier 1<> GrosFichier


Tout de suite les gros mots..
sed -i /toto/d Grosfichier
[...]


Ca n'aidera pas. sed -i ne travaille pas /in-place/ il utilse un
fichier temporaire (du meme nom que le fichier original, mais
au moment de lire la dernier ligne, les deux fichiers coexistent
sur disque et donc occupent deux fois la taille du fichier
original). La solution perl si dessus overwrite le fichier
original, c'est different et ne fonctionne que dans certains cas
comme celui-ci ou ce qu'on ecrit est toujours plus petit (ou de
meme taille) que ce qu'on lit.

--
Stéphane