Ответы:
Самый очевидный ответ - просто использовать команду diff, и, возможно, стоит добавить в нее параметр --speed-large-files.
diff --speed-large-files a.file b.file
Вы упоминаете несортированные файлы, поэтому, возможно, вам нужно сначала отсортировать файлы
sort a.file > a.file.sorted
sort b.file > b.file.sorted
diff --speed-large-files a.file.sorted b.file.sorted
Вы можете сохранить создание дополнительного выходного файла, отправив выходные данные 2-й сортировки прямо в diff
sort a.file > a.file.sorted
sort b.file | diff --speed-large-files a.file.sorted -
Очевидно, что они лучше всего будут работать в системе с большим количеством доступной памяти, и вам, вероятно, также понадобится много свободного дискового пространства.
Из твоего вопроса не было ясно, пробовал ли ты это раньше. Если так, то было бы полезно узнать, что пошло не так (слишком долго и т. Д.). Я всегда обнаруживал, что стандартные команды sort и diff имеют тенденцию выполнять как минимум так же хорошо, как и пользовательские команды, если только у файлов нет специфических для домена свойств, которые позволяют делать вещи по-другому.
diff <(command 1) <(command 2)
<(cmd1) <(cmd2)
работает синтаксис (как будто он дважды перенаправляет стандартный ввод!), Попробуйте echo hello <(cmd1) <(cmd2)
. Вы увидите что-то вроде этого, hello /dev/fd/63 /dev/fd/62
которое внезапно проясняет;)
--speed-large-files
опция не помогает, если у вас недостаточно оперативной памяти. Кроме того, предварительная сортировка не помогает, если у вас есть многострочная структура записи, которую вы хотите сохранить. Опции, упомянутые выше (автор @unhammer), интересны, но вывод от rdiff
и bsdiff
является скорее двоичным. Установка bdiff
из Heirloom Toolbox выглядит как задача даунинга (требуется Heirloom devtools, вымершие заголовочные файлы,…). Это действительно стоит усилий? Есть ли другие альтернативы?
Сортировка входных данных и сообщение diff
программе, что входные данные отсортированы, обеспечат значительное ускорение. Я не знаю ни одного diff
с такой опцией, но comm
предполагает сортированный ввод и будет гораздо быстрее, если этого будет достаточно для ваших целей.
comm
отлично работал для этого, никогда не слышал об этом раньше, но, видимо, его в coreutils.
mkfifo
для создания,[ab].file.sorted
прежде чем использовать их в качестве вывода дляsort
. Поместите обаsort
с&
в фоновом режиме и используйте оба канала в качестве имен файлов для diff.