У меня есть два больших файла (6 ГБ каждый). Они не отсортированы, с переводами строки ( \n
) в качестве разделителей. Как я могу их различить? Это должно занять до 24 часов.
источник
У меня есть два больших файла (6 ГБ каждый). Они не отсортированы, с переводами строки ( \n
) в качестве разделителей. Как я могу их различить? Это должно занять до 24 часов.
Самый очевидный ответ - просто использовать команду 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 имеют тенденцию выполнять как минимум так же хорошо, как и пользовательские команды, если только у файлов нет специфических для домена свойств, которые позволяют делать вещи по-другому.
mkfifo
для создания,[ab].file.sorted
прежде чем использовать их в качестве вывода дляsort
. Поместите оба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.