Відповіді:
Найбільш очевидна відповідь - просто використовувати команду 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
ви можете зберегти, створюючи додатковий вихідний файл, трубопроводом виводу другого роду безпосередньо в diff
sort a.file > a.file.sorted
sort b.file | diff --speed-large-files a.file.sorted -
Очевидно, що вони працюватимуть найкраще в системі з великою кількістю доступної пам’яті, і вам, швидше за все, знадобиться багато вільного місця на диску.
З вашого запитання не було зрозуміло, ви пробували це раніше. Якщо так, то було б корисно знати, що пішло не так (зайняло занадто багато часу тощо). Я завжди виявляв, що команди сортування та різниці команд, як правило, виконують принаймні так само, як і спеціальні команди, якщо не існують деякі дуже доменні властивості файлів, які дозволяють робити інакше.
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 виглядає як захоплююча задача (потрібні програми Heirloom, вимерлі файли заголовків…). Чи справді варто докласти зусиль? Чи є інші альтернативи?
Сортування входів та повідомлення diff
програми, що впорядковані входи, забезпечили б значне прискорення. Я не знаю жодного diff
з подібним варіантом, але comm
передбачає відсортований вхід і буде набагато швидшим, якщо це буде достатньо для ваших цілей.
comm
працював чудово для цього, ніколи не чув про нього раніше, але, мабуть, його в coreutils.
mkfifo
для створення,[ab].file.sorted
перш ніж використовувати їх як вихідsort
. Поставте обидваsort
s&
у фоновому режимі та використовуйте обидва канали як імена файлів для розл.