#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