Сравнение двух файлов строго построчно, без вставок и удалений

13

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

file1:       file2:

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

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

 0001
+FFFF
 ABCD
 1234
-FFFF

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

ломаться
источник

Ответы:

18

Это может быть подход:

diff <(nl file1) <(nl file2)

С nlномером строки, которые diffраспознают строки строка за строкой.

хаос
источник
3
Это круто, я не знал программу NL. Эти инструменты Unix действительно удобны, но их так много .
Фриц
1
Я только что попробовал это, и, к сожалению, что я получаю: каждая строка первого файла, затем каждая строка второго файла ... вместо строки 1 из файла 1, затем строка 1 из файла два, а затем строка 2 из файла один, за которым следует строка 2 из файла 2 ...
Майкл Хьюсон
@MichaelHewson Похоже, что у ваших двух файлов нет общих строк. В таком случае, это просто, как diffработает. Вы можете попробовать программу gui, meldкоторая показывает два файла рядом. Как вmeld <(nl file1) <(nl file2)
Фриц