Linux bash liste lignes non présentes fichie2

Bonjour,

Je cherche une commande me permettant d'obtenir la liste des lignes présentes dans le fichier 1 mais non présentes dans le fichier 2. Chaque ligne contient uniquement une adresse email.

j'ai essayé via la commande comm mais elle ne permet pas exactement ça.

Exemple :

fichier 1 (chaque fichier est passé par uniq et sort donc pas de doublon) :

email1@ledomaine.com
email2@ledomaine.com
email3@ledomaine.com

fichier 2 :
email2@ledomaine.com

résultat espéré ... :

email1@ledomaine.com
email3@ledomaine.com

En vous remerciant !

Stéphane

10 réponses

  1. Bonsoir,

    diff fichier1 fichier2
    1. diff compare les 2 fichiers ligne par ligne donc je ne pense pas que ça corresponde à ce que je recherche. (le résultat de la commande me laisse d'ailleurs dubitatif).

      Cependant, merci d'avoir pris un peu de votre temps pour moi.

      Stéphane
  2. Modérateur
    Salut,
    [tmpfs]$ cat fich1
    email1@ledomaine.com
    email2@ledomaine.com
    email3@ledomaine.com
    
    [tmpfs]$ cat fich2
    email2@ledomaine.com
    
    [tmpfs]$ grep -v "$(sort fich* | uniq -d)" fich1
    email1@ledomaine.com
    email3@ledomaine.com
    
    [tmpfs]$ 
    ;-))

    Edit : $(cat fich* | sort | uniq -d) => "$(sort fich* | uniq -d)"
    1. Bonjour,

      Je viens d'essayer la solution grep mais j'ai une erreur :

      grep: email@supermegadomaine.fr: Aucun fichier ou dossier de ce type
      ....
      répété pour pas mal d'email...

      pour être sûr qu'on s'est bien compris, mon exemple ne contient que 3 lignes dans l'un et 1 dans l'autre fichier, en réalité j'ai plusieurs dizaine de millier de lignes par fichiers.

      Stéphane
    2. Modérateur
      @sbouliOn sait bien compris oui, la preuve dans mon message précédent et les exemples marchent bien avec les 2 fichiers fournis ... ;-\

      Quelle version de grep ? quel shell ? Quel système ?
  3. Ya comme un soucis ... :

    root@toto:# cat test1
    email1@ledomaine.com
    email2@ledomaine.com
    email3@ledomaine.com

    root@toto:# cat test2
    email2@ledomaine.com

    root@toto:# grep -v "$(sort test* | uniq -d)" test1
    root@toto:# $(cat test* | sort | uniq -d) => "$(sort test* | uniq -d)"
    -bash: email2@ledomaine.com : commande introuvable
    root@toto:#

    au secours ....

    Stéphane
    1. Modérateur
      jp@MDK:~/tmpfs ssh$ cat test1
      email1@ledomaine.com
      email2@ledomaine.com
      email3@ledomaine.com
      
      jp@MDK:~/tmpfs ssh$ cat test2
      email2@ledomaine.com
      
      jp@MDK:~/tmpfs ssh$ grep -v "$(sort test* | uniq -d)" test1
      email1@ledomaine.com
      email3@ledomaine.com
      
      jp@MDK:~/tmpfs ssh$
      ;-))
      1. hahahaha énorme ....

        donc systeme ubuntu hardy heron
        shell ... sh ...??
        grep --version GNU grep 2.5.3

        ça répond a la demande ?

        Stéphane
        1. Modérateur
          Et ça marche toujours pas ?
        2. @jipicyben non aucun changements ... :
          # cat test1
          email1@ledomaine.com
          email2@ledomaine.com
          email3@ledomaine.com
          
          # cat test2
          email2@ledomaine.com
          
          # grep -v "$(sort test* | uniq -d)" test1
          #
          
      2. Modérateur
        Tu peux exécuter la commande suivante et nous coller le résultat, s'il te plaît :
         set -xv; grep -v "$(sort test* | uniq -d)" test1; set -
        Merci.
        1. Désolé pour le delais j'étais parti manger :)

          # set -xv; grep -v "$(sort test* | uniq -d)" test1; set -
          sort test* | uniq -d
          ++ sort test1 test2
          ++ uniq -d
          + grep -v '
          email2@ledomaine.com' test1
          + set -
          #
          


          stéphane
      3. Modérateur
        Si tu tapes :
        grep -v 'email2@ledomaine.com' test1
        Ca donne quoi ?
        1. et voila :
          # grep -v 'email2@ledomaine.com' test1
          email1@ledomaine.com
          email3@ledomaine.com
          
          #
          


          c'est bien le retour à la ligne qui pioche ...

          grep -v '
          email2@ledomaine.com' test1

          stéphane
        2. Modérateur
          @sbouliEffectivement, mais il sort d'où ce retour à la ligne ???
          Décompose l'expression :
          sort test* | uniq -d
          Renvoie quoi ?
        3. @jipicyet voila :

          # sort test* | uniq -d
          
          email2@ledomaine.com
          #
          


          EDIT : si je sors les 2 lignes vierge en bas des fichiers j'ai bien :

          # cat test1
          email1@ledomaine.com
          email2@ledomaine.com
          email3@ledomaine.com
          # cat test2
          email2@ledomaine.com
          # grep -v "$(sort test* | uniq -d)" test1
          email1@ledomaine.com
          email3@ledomaine.com
          #
          


          stéphane
        4. Modérateur
          @sbouliC'est bon j'ai compris ;-\

          Vires les lignes vides à la fin de tes 2 fichiers test1 et test2 ;-(

          Dans mon exemple les lignes vides n'existent pas, c'est juste pour aérer la lecture que je les ai mises...
      4. Cependant, c'est le serpent qui se mort la queue ... si je lance la commande sur 2 fichiers avec quelques milliers de lignes, j'ai :

        # grep -v "$(sort fichier?.log | uniq -d)" fichier1.log
        -bash: /bin/grep: Liste d'arguments trop longue

        il doit pas aimer avec beaucoup de ligne dans fichier1.log et fichier2.log ....

        Stéphane

        1. UP

          Cependant, c'est le serpent qui se mort la queue ... si je lance la commande sur 2 fichiers avec quelques milliers de lignes, j'ai :

          # grep -v "$(sort fichier?.log | uniq -d)" fichier1.log
          -bash: /bin/grep: Liste d'arguments trop longue

          il doit pas aimer avec beaucoup de ligne dans fichier1.log et fichier2.log ....

          Stéphane
          1. Modérateur
            Voir dans la FAQ : Suppression impossible : liste d'arguments trop longue