Рейтинг:4

Как объединить два файла, исключив строки, существующие в обоих файлах?

флаг it

У меня есть 2 файла, которые не могут быть отсортированы. Оба они имеют список слов в строках. Я пытаюсь сравнить оба файла и создать новый без любые повторяющиеся строки, которые совпадают между обоими файлами. Это означает, что если строка в файле A найдена в файле B, она не должна отображаться в качестве результата вывода.

Существует огромная проблема со многими вопросами и сайтами, которые говорят в своих заголовках «Удаление дубликатов», хотя на самом деле это «Объединение дубликатов и отображение уникального». Эти 2 пункта очень разные. На самом деле повторяющиеся строки не удаляются, а только объединяются.

В этом конкретном случае мне действительно нужно УДАЛИТЬ ИХ. Так что если они найдены в обоих файлах, то в результате не отображаются.

я тестировал связь уже и это не удается. Я также протестировал несколько других случаев, таких как awk, grep, которые я видел. Правила для обоих файлов следующие:

  • Они имеют разный размер (не имеют одинакового количества строк)
  • Чтобы быть дубликатом, он сравнивает всю строку с каждой и всеми другими строками в другом файле.
  • Файлы не могут быть отсортированы

Вот некоторая информация о файлах, они содержат список адресов электронной почты, по одному электронному адресу в строке. Конечно, поскольку они разного размера, это не означает, что все электронные письма будут одинаковыми, но они содержат друг в друге все уникальные электронные письма. Просто некоторые электронные письма могут быть в обоих файлах. В случаях, когда электронные письма находятся в обоих файлах, выходные результаты не должны отображать эти электронные письма.

FedKad avatar
флаг cn
В чем причина того, что "_Файлы не могут быть отсортированы_"?
N0rbert avatar
флаг zw
Я не уверен, но вы можете попробовать утилиту `dwdiff` для сравнения; см. https://askubuntu.com/a/1073389/66509 для справки.
флаг hr
Могут ли возникать дубликаты *внутри* любого из файлов? В каком порядке объединять результаты? Пожалуйста, рассмотрите возможность предоставления минимального примера.
Luis Alvarado avatar
флаг it
@steeldriver, в каждом файле нет дубликатов (слава богу). Все они уникальны)
флаг hr
* "если строка в файле A найдена в файле B, она не должна отображаться как результат вывода" * звучит как `grep -vFxf fileB fileA`, тогда как *" если они найдены в обоих файлах, они не отображаются как результат"* звучит как `awk'!seen[$0]++' файлA файлB`. Здесь будет полезен краткий репрезентативный пример.
Luis Alvarado avatar
флаг it
@steeldriver Спасибо, друг, я проверил их оба, но безуспешно. Они все еще показывают вывод неправильно. Так, например, в одном файле 700 писем, в другом 80 писем. Я точно знаю, что почти все 80 электронных писем дублируют 700, поэтому количество выходных сообщений должно быть около 620 электронных писем.
Luis Alvarado avatar
флаг it
Исправление, я только что снова проверил 1-й, но заметил букву f в конце. Я сделал это, и это сработало. Но awk не показал правильных результатов, хотя ваш grep показал. Не могли бы вы указать это как ответ, так как это ДЕЙСТВИТЕЛЬНО сработало для меня через несколько часов.
Рейтинг:1
флаг cn

Есть более эффективные способы, но вот а решение. Я не был уверен, как вы хотите, чтобы файлы были объединены. Таким образом, в этом решении отдельные строки из файла1 записываются в новый файл, а затем в новый файл записываются отдельные строки из файла2.

# remove_dupes.py
из системного импорта argv

infile1 = открыть (str (argv [1]), "r" )
infile2 = открыть(str(argv[2]), "r" )
пытаться:
    выходной файл = открыть (str (argv [3]), "w" )
кроме (IndexError):
    выходной файл = открыть('вне', "w")


if1_arr = infile1.readlines()
if2_arr = infile2.readlines()
tmp_arr = if2_arr



исключить = []
для строки в if1_arr:
    если строка в if2_arr:
        исключить.добавлять(строка)
    еще:
        outfile.write(строка)

для строки в if2_arr:
    если строка не в исключении:
        outfile.write(строка)

infile1.close()
infile2.close()
выходной файл.close()

Бежать:

python3 remove_dupes.py <файл1> <файл2> <выходной_файл>

Если вы хотите превратить это в более быстрый инструмент командной строки, переместите сценарий в долгосрочное место и добавьте следующую строку в свой файл .bashrc, .bash_aliases, .zshrc или аналогичный файл.

псевдоним mydiff='python3 <path_to_script> '

Вы можете заменить «mydiff» на то, что вы хотите назвать. После этого вы можете запустить скрипт с помощью:

mydiff <файл1> <файл2> <выходной_файл>

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.