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