Linux bash liste lignes non présentes fichie2

sbouli Messages postés 208 Statut Membre -  
jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   -
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. macartur95 Messages postés 168 Statut Membre 23
     
    Bonsoir,

    diff fichier1 fichier2
    0
    1. sbouli Messages postés 208 Statut Membre 2
       
      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. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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. sbouli Messages postés 208 Statut Membre 2
       
      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
      1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > sbouli Messages postés 208 Statut Membre
         
        On 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
      2. sbouli Messages postés 208 Statut Membre 2 > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
         
        j'avais pas vu le edit :)
        0
  3. sbouli Messages postés 208 Statut Membre 2
     
    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
  4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. sbouli Messages postés 208 Statut Membre 2
     
    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. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Et ça marche toujours pas ?
      0
      1. sbouli Messages postés 208 Statut Membre 2 > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
         
        ben 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
  7. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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. sbouli Messages postés 208 Statut Membre 2
       
      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
  8. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Si tu tapes :
    grep -v 'email2@ledomaine.com' test1
    Ca donne quoi ?
    0
    1. sbouli Messages postés 208 Statut Membre 2
       
      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
      1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > sbouli Messages postés 208 Statut Membre
         
        Effectivement, mais il sort d'où ce retour à la ligne ???
        Décompose l'expression :
        sort test* | uniq -d
        Renvoie quoi ?
        0
      2. sbouli Messages postés 208 Statut Membre 2 > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
         
        et 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
      3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > sbouli Messages postés 208 Statut Membre
         
        C'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
  9. sbouli Messages postés 208 Statut Membre 2
     
    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
  10. sbouli Messages postés 208 Statut Membre 2
     
    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
  11. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Voir dans la FAQ : Suppression impossible : liste d'arguments trop longue
    0