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
    0
    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
      0
  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)"
    0
    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
      0
    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 ?
      0
    3. @jipicyj'avais pas vu le edit :)
      0
  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
    0
    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$
      ;-))
      0
      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
        0
        1. Modérateur
          Et ça marche toujours pas ?
          0
        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
          #
          
          0
      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.
        0
        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
          0
      3. Modérateur
        Si tu tapes :
        grep -v 'email2@ledomaine.com' test1
        Ca donne quoi ?
        0
        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
          0
        2. Modérateur
          @sbouliEffectivement, mais il sort d'où ce retour à la ligne ???
          Décompose l'expression :
          sort test* | uniq -d
          Renvoie quoi ?
          0
        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
          0
        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...
          0
      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

        0
        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
          0
          1. Modérateur
            Voir dans la FAQ : Suppression impossible : liste d'arguments trop longue
            0