Suppression de mots via bash ou sed - Codes et scripts - Linux et OS Alternatifs
Marsh Posté le 05-10-2006 à 13:41:38
ReplyMarsh Posté le 05-10-2006 à 13:53:58
Oui je connai cette méthode aussi mais mon problème reste là. Supprimer une ligne d'un fichier je sais, mais je désire supprimer une ligne d'un fichier qui contient un mot d'un autre... Dit comme ça je sais que je suis pas loin...
du genre grep -v interdits.txt phrases.txt > toto
Pour infos si tu fais un bench de sed et grep tu t'aperçois que sed est plus rapide
Marsh Posté le 05-10-2006 à 14:09:52
je ne connais pas d'autre moyen que de faire une boucle sur les mots de 'interdits.txt' pour virer les phrases correspondantes les unes après les autres.
Tu pourrais aussi peut-être concocter une énorme regexp matchant tous les mots interdits, mais c'est peut-être pas faisable s'il y en a beaucoup...
Marsh Posté le 05-10-2006 à 14:12:00
Skibyzou a écrit : Oui je connai cette méthode aussi mais mon problème reste là. Supprimer une ligne d'un fichier je sais, mais je désire supprimer une ligne d'un fichier qui contient un mot d'un autre... Dit comme ça je sais que je suis pas loin... |
Certes, mais beaucoup plus chiant à utiliser ...
Essayes de voir en perl, c'est super facile à faire, même si c'est moins rapide.
Marsh Posté le 05-10-2006 à 14:14:55
franceso a écrit : je ne connais pas d'autre moyen que de faire une boucle sur les mots de 'interdits.txt' pour virer les phrases correspondantes les unes après les autres. |
disons que grep -v interdits.txt phrases.txt > toto ne marche pas... Je dois me planter quelque part...
Citation : Essayes de voir en perl, c'est super facile à faire, même si c'est moins rapide. |
Disons que c'est une question de flemme.... et que j'aime pas buter sur un truc simple... Je sais que je vais me sentir stupide une fois trouver la soluce....
Marsh Posté le 05-10-2006 à 14:37:52
Skibyzou a écrit : disons que grep -v interdits.txt phrases.txt > toto ne marche pas... Je dois me planter quelque part... |
non, il faut faire une boucle sur tous les mots présents dans le fichier interdits.txt
sinon, est-ce que cette solution te plaît :
#! /bin/sh |
EDIT: je rejoins l'avis de WedgeAnt : Perl serait sans doute plus adapté pour ce type de choses
Marsh Posté le 05-10-2006 à 14:39:37
Avec une boucle?
Code :
|
edit:grille, évidemment.
Marsh Posté le 05-10-2006 à 14:51:25
neriki a écrit :
|
Merci Neriki et francesco. Neriki ta solution à l'air de fonctionner, mais (il faut bien un mais) j'ai lancé le processus et il ne semble pas vouloir s'arrêter... Une boucle infini est elle possible à l'intérrieur des fichiers, ou cela vient il de la taille de mes fichiers (1 millions de lignes pour phrases.txt, 13 000 pour interdits.txt)....
Marsh Posté le 05-10-2006 à 15:10:36
Un problème subsite, il fait de la comparaison phrases à phrases, hors moi il me faudrait mot à phrases en quelques sorte.
Exemple :
Dans les mots interdits.txt j'ai fromage
et dans mon fichiers phrases.txt, j'ai fromage blanc
Il faudrait que toute la ligne soit supprimée...
hors celà ne le fais pas...
J'avais pensé à ça aussi *
diff interdits.txt phrases.txt | grep ">" | sed s/\>// > toto
Même problème...
Marsh Posté le 05-10-2006 à 15:19:48
Skibyzou a écrit : Dans les mots interdits.txt j'ai fromage |
c'est à cause de la regexp que tu as donnée à sed. Par contre, je ne connais pas assez bien sed pour te proposer une regexp qui supprime toute la ligne.
Je n'avais pas compris que tu avais autant de mots interdits. N'essaie pas de lancer la solution que je t'ai proposée tout à l'heure : tu mettrais ta machine à plat... Il vaut mieux une solution à base de cp et fichiers temporaires (comme celle de neriki) plutôt qu'une à base de pipes (comme la mienne)
Marsh Posté le 05-10-2006 à 15:50:55
Non je ne pense pas que cela vienne de ma regexp. En faite mon prob c'est que ça compare les mots et les supprimes avec la même condition. Bref cela ne compare pas à l'intérieur de la ligne... Je sais je me répète ...
Marsh Posté le 05-10-2006 à 16:04:51
Skibyzou a écrit : Non je ne pense pas que cela vienne de ma regexp. |
Au temps pour moi ! ta regexp semble être bonne... (je sais, je suis vraiment nul en sed)
Du coup, je ne comprends pas trop ton problème. Si 'fromage' apparaît dans "interdits.txt", alors n'importe quelle ligne de "phrases.txt" contenant 'fromage' va être supprimée par la sed. Peux tu donner un extrait de tes fichiers qui montre bien ce qui ne va pas ?
Comment est formaté ton fichier de phrases ? Tu as une phrase par ligne, non ?
Marsh Posté le 05-10-2006 à 16:09:28
Oui une phrase par ligne. Du genre
Dans le fichier interdits.txt
fromage
citron
Dans le fichier phrases.txt
fromage blanc 5
fromage 2
citron 4
citron pressé 3
Mais je peux avoir ces phrases là
" balcon " 9
Les chiffres sont en faites là pour attester le nombre de fois que le mots à été cherché, ce sont des fichiers extrait de BDD, mais formaté exactement comme ça.
Les phrases donc fromage et citron seront supprimées, mais pas les deux autres... Car dans la fonction bash compare les ligne entre elle avec la même condition et non pas mot à mot.
Marsh Posté le 05-10-2006 à 16:20:03
tu utilises le script de neriki, ou bien ta solution à base de diff ?
Marsh Posté le 05-10-2006 à 16:20:50
Le script de neriki tourne dans le vide, mais solution à base de diff à l'air de fonctionner.
Marsh Posté le 05-10-2006 à 12:51:45
Bonjour,
Voilà j'ai deux fichiers. L'un contenant des phrases qu'on appelera phrases.txt, l'autres comprenant des mots (voir aussi des phrases) qu'on appelera interdits.txt. En gros voilà ce que je cherche à faire:
Toute les chaines de caractères comprises dans mon fichiers interdits.txt ne doivent pas être dans mon phrases.txt. C'est à dire que dès qu'une ligne de phrases.txt contient un mot ou une phrases de interdits.txt, il faut que cette ligne soit supprimée.
Les deux fichiers sont ordonnées de en colonne, un mot ou une phrase par ligne.
Je cherche à le faire de la façon la plus simple possible notament par sed ou bash. Je saurai comment supprimer un mot dans un fichiers via sed, mais je n'arrive pas à supprimer un mot d'un fichier contenu dans un autre fichier.
Merci par avance pour votre aide.