首页 > 解决方案 > 从文件中删除它们在另一个文件中存在 2 次或更多次的行

问题描述

假设有两个文件 File1.txt 和 File2.txt,每个文件都包含电子邮件地址。如果 file2.txt 中存在 >=2 次,我需要从 file1.txt 中删除所有电子邮件地址。

我需要这样做以确保某人收到的电子邮件不超过两次。

我见过其他人使用 comm 或 diff 来解决类似的问题,但我不确定在这种情况下该怎么做。

例子

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  

输出(file1 中不在 file2.txt 中的文件超过 2 次)

File3.txt:   
def@gmail.com  
ghi@gmai.com  
jkl@gmail.com    

还假设此文件有 100,000 多条记录,因此无法手动完成

标签: shellunixtext-files

解决方案


或多或少是蛮力的。假设File2.txt不是很大(即,可以或多或少完全适合内存),您可以通过它,计算每行的出现次数,然后使用它来确定是否从File1.txt.

perl -nle 'BEGIN{open $f2, "<", "File2.txt" or die $!; while(<$f2>){$seen{$_}++}} print unless $seen{$_} > 2' File1.txt

这将产生File1.txton stdout 的剥离版本,您可以根据需要重定向它。


推荐阅读