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