Disons qu'il y a deux fichiers File1.txt et File2.txt, chaque fichier contient des adresses e-mail. Je dois supprimer toutes les adresses e-mail de file1.txt si elles sont présentes dans file2.txt> = 2 fois.
Je dois faire cela pour m'assurer que quelqu'un ne reçoit pas plus de deux e-mails.
J'ai vu d'autres personnes utiliser comm ou diff pour des questions similaires, mais je ne sais pas quoi faire dans ce cas.
Exemple
File3.txt: def@gmail.com ghi@gmai.com jkl@gmail.com
Sortie (Fichiers du fichier1 qui ne sont pas dans file2.txt plus de 2 fois)
File1.txt: abc@gmail.com def@gmail.com ghi@gmai.com jkl@gmail.com File2.txt: abc@gmail.com abc@gmail.com acb@gmai.com ghi@gmai.com jkl@gmail.com
3 Réponses :
Commandez File2.txt
, et pour chaque entrée qui est dupliquée, vérifiez si elle est présente dans File1.txt
. ( uniq -c
peut être utile)
Plus ou moins de force brute. En supposant que File2.txt
n'est pas très gros (c'est-à-dire qu'il peut plus ou moins tenir entièrement en mémoire), vous pouvez simplement le parcourir, compter les occurrences de chaque ligne, puis l'utiliser pour déterminer si pour imprimer la ligne de File1.txt
.
perl -nle 'BEGIN{open $f2, "<", "File2.txt" or die $!; while(<$f2>){$seen{$_}++}} print unless $seen{$_} > 2' File1.txt
Ceci produira la version dépouillée de File1.txt
sur stdout, et vous pouvez redirigez-le comme vous le souhaitez.
Avec uniq
, vous pouvez trouver des lignes qui se répètent:
grep -vf <(sort File2.txt | uniq -d) File1.txt
Voici les lignes que vous souhaitez supprimer de File1.txt
.
Lorsque la sortie uniq
est dans un fichier, vous pouvez utiliser ce fichier pour une instruction grep
.
sort File2.txt | uniq -d > /tmp/derek.tmp grep -vf /tmp/derek.tmp File1.txt
Ces lignes peut être combiné dans
sort File2.txt | uniq -d
Afficher quelques exemples de données avec la sortie attendue associée. Aussi, qu'avez-vous essayé?