Suppression de mots via bash ou sed

Suppression de mots via bash ou sed - Codes et scripts - Linux et OS Alternatifs

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.
 

Reply

Marsh Posté le 05-10-2006 à 12:51:45   

Reply

Marsh Posté le 05-10-2006 à 13:41:38    

regarde du côté de 'grep -v'


---------------
TriScale innov
Reply

Marsh 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 :p

Message cité 1 fois
Message édité par Skibyzou le 05-10-2006 à 13:56:39
Reply

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...


---------------
TriScale innov
Reply

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...
 
Pour infos si tu fais un bench de sed et grep tu t'aperçois que sed est plus rapide :p


 
Certes, mais beaucoup plus chiant à utiliser ...
Essayes de voir en perl, c'est super facile à faire, même si c'est moins rapide.


---------------
Wedge#2487 @HS -#- PW: +∞ -#- Khaz-Modan/Boltiz @WoW
Reply

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.... :)

Reply

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
 
(
    echo cat phrases.txt "\\"
    for mot in `cat interdits.txt`
      do
      echo "|" grep -v $mot "\\"
    done
) | /bin/sh


 
 
EDIT: je rejoins l'avis de WedgeAnt : Perl serait sans doute plus adapté pour ce type de choses


Message édité par franceso le 05-10-2006 à 14:39:04

---------------
TriScale innov
Reply

Marsh Posté le 05-10-2006 à 14:39:37    

Avec une boucle?
 

Code :
  1. for i in $(cat interdits.txt ); do sed /$i/d phrases.txt>tmp; cp tmp phrases.txt; done


 
edit:grille, évidemment. [:dawao] [:zytrasnif]

Message cité 1 fois
Message édité par neriki le 05-10-2006 à 14:40:34

---------------
C'est pas bon, Neriki, tu recommences à glander, là. :o
Reply

Marsh Posté le 05-10-2006 à 14:51:25    

neriki a écrit :


 

Code :
  1. for i in $(cat interdits.txt ); do sed /$i/d phrases.txt>tmp; cp tmp phrases.txt; done




 
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)....

Reply

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...

Reply

Marsh Posté le 05-10-2006 à 15:10:36   

Reply

Marsh Posté le 05-10-2006 à 15:19:48    

Skibyzou a écrit :

Dans les mots interdits.txt j'ai fromage
et dans mon fichiers phrases.txt, j'ai fromage blanc

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)


---------------
TriScale innov
Reply

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 :/ ...

Message cité 1 fois
Message édité par Skibyzou le 05-10-2006 à 15:53:55
Reply

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 ?


---------------
TriScale innov
Reply

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.


Message édité par Skibyzou le 05-10-2006 à 16:13:03
Reply

Marsh Posté le 05-10-2006 à 16:20:03    

tu utilises le script de neriki, ou bien ta solution à base de diff ?


---------------
TriScale innov
Reply

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed