Из командной строки Linux/Unix/Mac:
sort file1 file2 | uniq -d | sort file2 - | uniq -u
Объяснение:
Это возвращает только те строки в file2, которые точно не соответствуют ни одной строке в file1.
шаги:
sort file1 file2
: объединяет file1 и file2 вместе, сортирует их и печатает на стандартный вывод. Обратите внимание, что дубликаты будут перечислены в соседних строках (дважды подряд) после сортировки.
uniq -d
: принимает выходные данные предыдущей команды и печатает только строки, которые являются дубликатами.
sort file2 -
: объединяет исходный файл2 и выходные данные предыдущей команды (stdout, который представлен именем файла " -
" дефис) и печатает результат в stdout. Кроме того, любые элементы в file2, которые также были в file1, будут продублированы (перечислены два раза подряд) в выходных данных.
uniq -u
: принимает выходные данные предыдущей команды и печатает только элементы, которые не дублируются (другими словами, печатает только элементы, которые не перечислены дважды подряд).
Возможные ошибки:
Это предполагает, что любая заданная строка в file1 точно соответствует соответствующей строке в file2. Если, например, file1 и file2 имели один и тот же адрес электронной почты, но с разной капитализацией; или если файл1 имеет имя "Джон Сэмпсон", а файл2 имеет тот же адрес электронной почты с именем "Джонатан Сэмпсон", они не будут считаться дубликатами.
Вы можете контролировать это, предварительно обработав файл, чтобы удалить все, кроме адреса электронной почты, и, кроме того, строчный адрес электронной почты. Команды Unix cut
и tr
могут быть полезны в этом случае. Или вы можете переключиться на SQL для более сложных сценариев.
Размер файла:
Файл из 200 000 строк и одна из 12 000 строк не очень большой. Я сгенерировал файлы одинакового размера, используя файл /usr/share/dict/words
на моем MacBook Pro, и протестировал приведенную выше команду; Это заняло менее 5 секунд.