Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3051 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  Suppression de mots via bash ou sed

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Suppression de mots via bash ou sed

n°848763
Skibyzou
Posté le 05-10-2006 à 12:51:45  profilanswer
 

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.
 

mood
Publicité
Posté le 05-10-2006 à 12:51:45  profilanswer
 

n°848777
franceso
Posté le 05-10-2006 à 13:41:38  profilanswer
 

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


---------------
TriScale innov
n°848781
Skibyzou
Posté le 05-10-2006 à 13:53:58  profilanswer
 

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
n°848784
franceso
Posté le 05-10-2006 à 14:09:52  profilanswer
 

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
n°848786
wedgeant
Da penguin inside
Posté le 05-10-2006 à 14:12:00  profilanswer
 

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
n°848787
Skibyzou
Posté le 05-10-2006 à 14:14:55  profilanswer
 

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

n°848790
franceso
Posté le 05-10-2006 à 14:37:52  profilanswer
 

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
n°848791
neriki
oenologue
Posté le 05-10-2006 à 14:39:37  profilanswer
 

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
n°848796
Skibyzou
Posté le 05-10-2006 à 14:51:25  profilanswer
 

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

n°848802
Skibyzou
Posté le 05-10-2006 à 15:10:36  profilanswer
 

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

mood
Publicité
Posté le 05-10-2006 à 15:10:36  profilanswer
 

n°848804
franceso
Posté le 05-10-2006 à 15:19:48  profilanswer
 

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
n°848819
Skibyzou
Posté le 05-10-2006 à 15:50:55  profilanswer
 

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
n°848826
franceso
Posté le 05-10-2006 à 16:04:51  profilanswer
 

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
n°848829
Skibyzou
Posté le 05-10-2006 à 16:09:28  profilanswer
 

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
n°848832
franceso
Posté le 05-10-2006 à 16:20:03  profilanswer
 

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


---------------
TriScale innov
n°848834
Skibyzou
Posté le 05-10-2006 à 16:20:50  profilanswer
 

Le script de neriki tourne dans le vide, mais solution à base de diff à l'air de fonctionner.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  Suppression de mots via bash ou sed

 

Sujets relatifs
[Bash] Affectation de données dans un tabeau via une boucleBash Unix et installation apache mysql sur Mac OS X
Probleme avec suppression de themes KDE3.1 !Suppression lignes liste déroulante de Google
[bash] Fichiers de configuration[bash] Traitement de chaine et manipulation de données
[bash] permission non accordéebash par défaut
executer un script bash depuis IE[debian] forcer la suppression d'un paquet [résolu]
Plus de sujets relatifs à : Suppression de mots via bash ou sed


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR