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
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
-
Bonsoir,
diff fichier1 fichier2 -
ModérateurSalut,
[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)"
-
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 -
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 ?
-
@jipicyj'avais pas vu le edit :)
-
-
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 -
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$
;-))
-
hahahaha énorme ....
donc systeme ubuntu hardy heron
shell ... sh ...??
grep --version GNU grep 2.5.3
ça répond a la demande ?
Stéphane-
-
@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 #
-
-
ModérateurTu 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.
-
ModérateurSi tu tapes :
grep -v 'email2@ledomaine.com' test1
Ca donne quoi ?
-
-
Modérateur@sbouliEffectivement, mais il sort d'où ce retour à la ligne ???
Décompose l'expression :sort test* | uniq -d
Renvoie quoi ?
-
@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 -
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...
-
-
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
-
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 -
ModérateurVoir dans la FAQ : Suppression impossible : liste d'arguments trop longue