Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 从另一个文件中存在行的文件中删除行2次或更多次_Shell_Unix_Text Files - Fatal编程技术网

Shell 从另一个文件中存在行的文件中删除行2次或更多次

Shell 从另一个文件中存在行的文件中删除行2次或更多次,shell,unix,text-files,Shell,Unix,Text Files,假设有两个文件File1.txt和File2.txt,每个文件包含电子邮件地址。我需要删除file1.txt中的所有电子邮件地址,如果该地址在file2.txt中出现>=2次 我需要这样做,以确保某人的电子邮件发送次数不会超过两次 我见过其他人使用comm或diff来回答类似的问题,但我不确定在这种情况下该怎么办 范例 File1.txt: abc@gmail.com def@gmail.com ghi@gmai.com jkl@gmail.com File2.txt:

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

我需要这样做,以确保某人的电子邮件发送次数不会超过两次

我见过其他人使用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  
输出(文件1中不在file2.txt中的文件超过2次)


另外,假设此文件有100000多条记录,因此无法手动执行此操作。对于每个重复的条目,请验证它是否存在于
File1.txt
中。(
uniq-c
可能会派上用场)

这或多或少是一种蛮力。假设
File2.txt
不是很大(也就是说,可以或多或少完全放在内存中),您只需浏览一下,计算每行出现的次数,然后使用它来确定是否从
File1.txt
打印该行

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

perl-nle'BEGIN{open$f2,使用
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

grep-vf显示一些具有相关预期输出的示例数据。另外,您尝试了什么?
grep -vf <(sort File2.txt | uniq -d) File1.txt