Удаление строк из файла, где они присутствуют в другом файле 2 или более раз

#shell #unix #text-files

#оболочка #unix #текстовые файлы

Вопрос:

Допустим, есть два файла 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  
  

Вывод (файлы из file1, которых нет в file2.txt более 2 раз)

 File3.txt:   
def@gmail.com  
ghi@gmai.com  
jkl@gmail.com    
  

Также предположим, что в этом файле более 100 000 записей, поэтому это невозможно сделать вручную

Комментарии:

1. Показывает примерные данные ome с соответствующим ожидаемым результатом. Кроме того, что вы пробовали?

Ответ №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 в стандартном выводе, и вы можете перенаправить ее, как захотите.

Ответ №2:

Упорядочивайте File2.txt и для каждой повторяющейся записи проверяйте, присутствует ли она в File1.txt . ( uniq -c может пригодиться)

Ответ №3:

С помощью 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