从文件中删除行的位置两次或更多次

时间:2019-03-13 15:23:15

标签: shell unix text-files

说有两个文件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多个记录,因此无法手动完成

3 个答案:

答案 0 :(得分:1)

或多或少地用力。假设File2.txt不太大(即或多或少可以完全容纳在内存中),您可以遍历它,计算每行的出现次数,然后使用该值确定是否从中打印该行File1.txt

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

这将在标准输出上生成File1.txt的剥离版本,您可以根据需要将其重定向。

答案 1 :(得分:0)

订购CTRL + Y,对于每个重复的条目,请验证其是否存在于File2.txt中。 (File1.txt可能会派上用场)

答案 2 :(得分:0)

使用uniq,您可以找到重复的行:

sort File2.txt | uniq -d

这些是您要从File1.txt中删除的行。
uniq输出位于文件中时,可以将此文件用于grep语句。

sort File2.txt | uniq -d > /tmp/derek.tmp
grep -vf /tmp/derek.tmp File1.txt

这些行可以合并为

grep -vf <(sort File2.txt | uniq -d) File1.txt