Відмінність двох великих текстових файлів


32

У мене є два великих файли (6 ГБ кожен). Вони несортовані, з \nроздільними каналами ( ) як роздільники. Як я можу їх відрізняти? Це має тривати менше 24 годин.

Відповіді:


45

Найбільш очевидна відповідь - просто використовувати команду 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 -

Очевидно, що вони працюватимуть найкраще в системі з великою кількістю доступної пам’яті, і вам, швидше за все, знадобиться багато вільного місця на диску.

З вашого запитання не було зрозуміло, ви пробували це раніше. Якщо так, то було б корисно знати, що пішло не так (зайняло занадто багато часу тощо). Я завжди виявляв, що команди сортування та різниці команд, як правило, виконують принаймні так само, як і спеціальні команди, якщо не існують деякі дуже доменні властивості файлів, які дозволяють робити інакше.


2
+1. Ви можете опустити всі тимчасові файли з іменованими трубами. Використовуйте mkfifoдля створення, [ab].file.sortedперш ніж використовувати їх як вихід sort. Поставте обидва sorts &у фоновому режимі та використовуйте обидва канали як імена файлів для розл.
krissi

15
@krissi Ви можете також досягти того ж ефекту, використовуючи цей синтаксис:diff <(command 1) <(command 2)
Michael Mrozek

Спасибі попрацювали. Мені знадобилося кілька ГБ пам’яті, але 16GB
ГЗ

7
Якщо хтось, як я, цікавиться, чому <(cmd1) <(cmd2)працює синтаксис (як це звучить як переадресація стандартного вводу двічі!), Спробуйте echo hello <(cmd1) <(cmd2). Ви побачите щось подібне, hello /dev/fd/63 /dev/fd/62що раптом дає зрозуміти;)
алекс

3
На мій досвід, --speed-large-filesваріант не допомагає, якщо у вас недостатньо оперативної пам’яті. Крім того, попереднє сортування не є корисним, якщо у вас є багаторядкова структура запису, яку ви хочете зберегти. Параметри, згадані вище (автор @unhammer), цікаві, але вихід із rdiffі bsdiffдосить двійковий. Установка bdiffз панелі інструментів Heirloom виглядає як захоплююча задача (потрібні програми Heirloom, вимерлі файли заголовків…). Чи справді варто докласти зусиль? Чи є інші альтернативи?
Крістіан Піетш

5

Сортування входів та повідомлення diffпрограми, що впорядковані входи, забезпечили б значне прискорення. Я не знаю жодного diffз подібним варіантом, але commпередбачає відсортований вхід і буде набагато швидшим, якщо це буде достатньо для ваших цілей.


commпрацював чудово для цього, ніколи не чув про нього раніше, але, мабуть, його в coreutils.
theferrit32
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.