Порівнюйте два файли строго по черзі, без вставок чи видалень


14

У мене є два файли, які по суті містять скидання пам’яті у шестигранному форматі. На даний момент я використовую diff, щоб побачити, чи відрізняються файли і де відмінності. Однак це може ввести в оману при спробі визначити точне місце (тобто адресу пам'яті) різниці. Розглянемо наступний приклад, що показує два файли поруч.

file1:       file2:

0001    |    0001
ABCD    |    FFFF
1234    |    ABCD
FFFF    |    1234

Тепер diff -uбуде показано одну вставку та одне видалення, хоча між двома файлами змінено 3 рядки (місця пам'яті):

 0001
+FFFF
 ABCD
 1234
-FFFF

Чи є простий спосіб порівняти два файли таким чином, що кожен рядок порівнюється лише з тим самим рядком (з точки зору нумерації рядків) в іншому файлі? Тож у цьому прикладі слід повідомити, що останні 3 рядки змінилися разом із зміненими рядками з file1та file2. Вихідні дані не повинні бути різним стилем, але було б здорово, якби його можна було забарвити (на даний момент я забарвлюю diff -uвихід, використовуючи sedтак, щоб його можна було легко адаптувати).

Відповіді:


19

Це може бути підхід:

diff <(nl file1) <(nl file2)

З nlнумерацією рядків, які diffрозпізнають лінії за рядком.


3
Це здорово, я не знав програми nl. Ці інструменти Unix дуже зручні, але їх дуже багато .
Фріц

1
Я тільки що спробував це, і, на жаль, я отримую: кожен рядок першого файлу, а потім кожний рядок другого файлу ... замість першого рядка з файлу 1, наступного рядка 1 з другого файлу, а потім другого рядка з файлу один, а потім рядок 2 з файлу 2 ...
Майкл Хьюсон

@MichaelHewson Це здається, що у ваших двох файлів немає спільних рядків. У такому випадку саме так diffпрацює. Ви можете спробувати програму gui, meldяка показує два файли поруч. Як уmeld <(nl file1) <(nl file2)
Фріц
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.