IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Suppression de ligne contenant un mot d'un autre fichier


Sujet :

Linux

  1. #1
    Invité
    Invité(e)
    Par défaut Suppression de ligne contenant un mot d'un autre fichier
    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.

    J'ai déjà fait un truc dans le style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    diff interdits.txt phrases.txt | grep ">" | sed s/\>// > toto
    ou encore

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i in $(cat interdits.txt ); do sed /$i/d phrases.txt>tmp; cp tmp phrases.txt; done
    Mais le problème reste le même. Il compare le mot et supprime avec la même condition, c'est à dire une comparaison ligne à ligne. Si j'ai le mot interdits fromage et que j'ai les phrases fromage et fromage blanc. La phrase fromage sera supprimée mais pas fromage blanc.

    Si vous avez des idées en Perl n'hésitez pas non plus

    Merci par avance pour votre aide.
    Dernière modification par ggnore ; 05/10/2006 à 17h02.

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    un peu tordu mais ...:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    while read ligne
    do
        MOTIF="$MOTIF""$ligne"'|'
    done < interdits.txt
    result=${result:0:(( val = ${#result} - 1 ))}
    MOTIF=${MOTIF:0:(( val = ${#MOTIF} - 1 ))}
    grep -Ev "$MOTIF" phrases.txt > toto
    toto ne devrait plus contenir de ligne avec mots interdit

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci beaucoup pour ton aide. Je viens d'écrire ton script, et j'ai lancé le processus... Etant donné que j'ai une liste de 13 000 mots interdits qui doit parcourir 880 000 lignes l'éxécution va être longue ! Je posterai une fois fini si cela a fonctionné.


    En attendant je vais essayer de trouver une solution Perl certainement mieu adapté pour ce type d'éxécution.

    Merci encore je vous tiens au courant

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    A oui 13k et 880 k tu annonces les difficulté apres coup toi
    je ne suis pas sur du tout que la variable "MOTIF" soit accepté dans ces conditions ....

  5. #5
    Invité
    Invité(e)
    Par défaut
    Merci pour ce script, mais (il faut bien un "mais"...)

    Le script à l'air de tourner dans le vide....

    Bon d'accord il y a 13 000 mots dans interdits.txt et 880 000 phrases dans phrases.txt mais je l'ai laissé tournée pendant 16h et le script est toujours en cours d'éxécution ....

    Boucle infinie ?

  6. #6
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 123
    Points
    28 123
    Par défaut
    Bonjour,

    Sauf erreur de ma part, ceci devrait fonctionner. C'est en tout cas le cas sur un essai sur quelques lignes...
    Seul soucis : le fichier de sortie n'est pas le même que le fichier d'entrée, mais ceci doit pouvoir se résoudre en faisant un script simple qui renomme le fichier phrase en phrase_a_traiter.txt, puis qui travaille que ce fichier, et sort le résultat dans phrase.txt, puis efface phrase_a_traiter.txt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -v `cat interdit.txt` phrase.txt > phrase_out.txt

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 111
    Points : 142
    Points
    142
    Par défaut Version en perl
    Voici une version en perl.

    Elle ajoute un test qui filtre uniquement les mots: c'est à dire espace(s) ou début de ligne à gauche, espace(s) ou fin de ligne à droite.

    C'est un peu gorrêt et peut être optimisé.

    De plus, ce n'est pas "strict", mais peut facilement le devenir.

    Finalement, il y a moyen de faire beaucoup plus court, mais le code en deviendrait illisible, et je crois que ce n'est pas intéressant pour toi...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    #!/usr/bin/perl
    die "Usage: $0 interdits lignes\n" if ($#ARGV != 1);
    open INT, "<", $ARGV[0] or die("Cannot open " . $ARGV[0] . ": $!\n");
    foreach (<INT>) {
            chomp;
            push @interdits, $_;
    }
    close INT;
    open LIGN, "<", $ARGV[1] or die("Cannot open " . $ARGV[1]  .": $!\n");
     
    foreach my $l (<LIGN>) {
            chomp $l;
            $perm=1;
            foreach my $i (@interdits) {
                    $perm = 0 if (
                            ($l =~ /[\s\t]+]$i[\s\t]+/) or #espace(s), mot, espace(s)
                            ($l =~ /^$i[\s\t]+/)        or #debut de ligne, mot, espace(s)
                            ($l =~ /[\s\t]+$i$/)        or #espace(s), mot, fin de ligne
                            ($l =~ /^$i$/)                 #debut de ligne, mot, espaces
                    )
            }
            print "$l\n" if $perm;
    }
    close LIGN;
    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $ cat interdits
    pim
    pam
    poum
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $ cat lignes
    pim va a l'ecole
    pam va a l'ecole
    poumpam va a l'ecole
    pam
    va a l'ecole, pam
    toto va a l'ecole
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $ ./filter interdits lignes
    poumpam va a l'ecole
    toto va a l'ecole

Discussions similaires

  1. [XL-2003] Macro de suppression de ligne avec un mot
    Par harisman87 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 19/07/2010, 16h50
  2. Supprimer ligne contenant un mot précis
    Par DjiLow dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/07/2010, 09h19
  3. Extraire une ligne contenant un mot clé
    Par Mael730 dans le forum Langage
    Réponses: 4
    Dernier message: 26/10/2009, 10h50
  4. [XL-2003] Suppression de ligne contenant "Label"
    Par mael86 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 24/10/2009, 19h34
  5. copier une ligne contenant un mot
    Par newbiedelphi dans le forum Delphi
    Réponses: 2
    Dernier message: 25/07/2006, 11h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo