Porównaj dwa pliki ściśle według linii, bez wstawiania i usuwania

14

Mam dwa pliki, które zasadniczo zawierają zrzuty pamięci w formacie szesnastkowym. W tej chwili używam diff, aby sprawdzić, czy pliki są różne i gdzie są różnice. Może to jednak wprowadzać w błąd przy próbie ustalenia dokładnej lokalizacji (tj. Adresu pamięci) różnicy. Rozważ następujący przykład przedstawiający dwa pliki obok siebie.

file1:       file2:

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

Teraz diff -upokaże jedno wstawienie i jedno usunięcie, chociaż między dwoma plikami zmieniły się 3 linie (lokalizacje pamięci):

 0001
+FFFF
 ABCD
 1234
-FFFF

Czy istnieje prosty sposób na porównanie dwóch plików, dzięki czemu każda linia jest porównywana tylko z tą samą linią (pod względem numeracji linii) w drugim pliku? Tak więc w tym przykładzie powinien on zgłosić, że zmieniły się ostatnie 3 linie wraz ze zmienionymi liniami od file1i file2. Wyjście doen't być Diff-styl, ale byłoby fajnie, gdyby mógł on być w kolorze (w kolorze chwilę na diff -uwyjście używając sedtak, że może być łatwo dostosowany).

Fritz
źródło

Odpowiedzi:

19

Może to być podejście:

diff <(nl file1) <(nl file2)

Z nlnumerem linie, które diffrozpoznają linie linia po linii.

chaos
źródło
3
Fajnie, nie znałem programu nl. Te narzędzia uniksowe są naprawdę przydatne, ale jest ich tak wiele .
Fritz
1
Właśnie tego próbowałem i niestety otrzymuję: każdy wiersz pierwszego pliku, po nim każdy wiersz drugiego pliku ... zamiast wiersza 1 z pliku 1, następnie wiersz 1 z pliku drugiego, a następnie wiersz 2 z pliku pierwszego, a następnie wiersz 2 z pliku 2 ...
Michael Hewson
@MichaelHewson Wygląda na to, że twoje dwa pliki nie mają wspólnych linii. W takim przypadku tak właśnie diffdziała. Możesz wypróbować program GUI, meldktóry pokazuje dwa pliki obok siebie. Jak wmeld <(nl file1) <(nl file2)
Fritz