shell - 从文件中删除它们在另一个文件中存在 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 多条记录,因此无法手动完成
解决方案
或多或少是蛮力的。假设File2.txt
不是很大(即,可以或多或少完全适合内存),您可以通过它,计算每行的出现次数,然后使用它来确定是否从File1.txt
.
perl -nle 'BEGIN{open $f2, "<", "File2.txt" or die $!; while(<$f2>){$seen{$_}++}} print unless $seen{$_} > 2' File1.txt
这将产生File1.txt
on stdout 的剥离版本,您可以根据需要重定向它。
推荐阅读
- c++ - 将图像添加到资产文件夹 UWP C++
- android - 生成的 apk 和调试模式的 Gson 不同行为
- content-management-system - directus cms如何加入
- r - 从 Shinyalert 回调重新运行响应式
- javascript - Javascript 对象内部自引用
- tensorflow - Tensorflow_probability 整数类型错误
- amazon-cloudwatch - 如何在 Codebuild 中从 Cloudwatch 检索匹配的事件?
- java - java在构建时执行文件
- javascript - 选项卡显示在抽屉中,但没有发生切换
- php - 从 Twig 中的数组中检索值