Linux bash liste lignes non présentes fichie2

Fermé
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 - 7 avril 2009 à 19:13
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 - 9 avril 2009 à 17:33
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

macartur95 Messages postés 165 Date d'inscription samedi 28 mars 2009 Statut Membre Dernière intervention 4 mai 2009 23
7 avril 2009 à 19:19
Bonsoir,


diff fichier1 fichier2
0
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 2
9 avril 2009 à 11:29
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
7 avril 2009 à 19:30
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
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 2
9 avril 2009 à 11:27
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897 > sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014
9 avril 2009 à 12:05
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
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 2 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
9 avril 2009 à 12:38
j'avais pas vu le edit :)
0
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 2
9 avril 2009 à 12:42
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
9 avril 2009 à 12:46
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 2
9 avril 2009 à 12:59
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
9 avril 2009 à 13:11
Et ça marche toujours pas ?
0
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 2 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
9 avril 2009 à 13:24
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
9 avril 2009 à 13:31
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
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 2
9 avril 2009 à 14:30
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
9 avril 2009 à 15:05
Si tu tapes :
grep -v 'email2@ledomaine.com' test1
Ca donne quoi ?
0
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 2
9 avril 2009 à 15:19
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897 > sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014
9 avril 2009 à 15:28
Effectivement, mais il sort d'où ce retour à la ligne ???
Décompose l'expression :
sort test* | uniq -d
Renvoie quoi ?
0
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 2 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
9 avril 2009 à 16:03
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897 > sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014
9 avril 2009 à 16:09
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
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 2
9 avril 2009 à 16:06
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
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 2
9 avril 2009 à 16:34
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
9 avril 2009 à 17:33
Voir dans la FAQ : Suppression impossible : liste d'arguments trop longue
0