1
votes

Supprimer des lignes d'un fichier où elles sont présentes dans un autre fichier 2 fois ou plus

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  


1 commentaires

Afficher quelques exemples de données avec la sortie attendue associée. Aussi, qu'avez-vous essayé?


3 Réponses :


0
votes

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)


0 commentaires

1
votes

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.


0 commentaires

0
votes

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


0 commentaires