2013-08-05 9 views
15

Chcę znaleźć różnicę między dwoma plikami, a następnie umieścić tylko różnice w trzecim pliku. Widziałem różne podejścia za pomocą awk, diff i comm. Czy są jeszcze jakieś?Najszybszym sposobem na znalezienie różnic między dwoma plikami w systemie UNIX?

np. Compare two files line by line and generate the difference in another file

np. Copy differences between two files in unix

muszę wiedzieć, co jest najszybszym sposobem na znalezienie wszystkich różnic i wymieniając je w pliku dla każdego z poniższych przypadkach -

Case 1 - file2 = file1 + extra text appended. 
Case 2 - file2 and file1 are different. 
+7

ponieważ to zależy od nakładów, to najlepiej zrobić to samemu – perreal

+0

czy możesz sprawić, że twoje sprawy są bardziej szczegółowe, a może dać przykładowy kod rzeczy, które wypróbowałeś? – asf107

+1

W przypadku 2 występuje 'cmp', który porównuje dwa bajty plików według bajtu. – micke

Odpowiedz

39

Można spróbować ..

comm -13 <(sort file1) <(sort file2) > file3 

lub

grep -Fxvf file1 file2 > file3 

lub

diff file1 file2 | grep "<" | sed 's/^<//g' > file3 

lub

join -v 2 <(sort file1) <(sort file2) > file3 
+0

tak, ale który z nich byłby najszybszy? – Steam

+1

Używając dwóch dużych plików tekstowych, w których jeden ma dodatkowy akapit w pobliżu początku, odmierzałam wszystkie cztery metody. Metody grep, diff i join nie znalazły dodatkowego akapitu. Aby funkcja działała, metody różnic muszą się ominąć ">". Nie znam metod grep ani join. Rezultat: comm: 3.661s, grep: 0.035s, diff: 0.051s, join: 3.811s –

+1

@JasonHartley Zdobądź kolegę z życia, istnieje tylko tyle sposobów, aby te komendy mogły być napisane. Również odpowiedź, której nie znasz, ma jedno polecenie, pod warunkiem, że dostarczyłem kilka. – danmc

1

Można także spróbować m.in. MD5 hash-sum lub podobny temat ustalenia, czy istnieją jakieś różnice w ogóle. Następnie porównać tylko pliki, które mają różne skrótów ...

+0

jak to zrobić? – Steam

+0

Ale czy mieszanie dwóch plików jest szybsze niż porównywanie dwóch plików? –

8

Inna opcja:

sort file1 file2 | uniq -u > file3 

Jeśli chcesz zobaczyć tylko zduplikowane wpisy używają "uniq -d" opcja:

sort file1 file2 | uniq -d > file3 
0

To zadziała szybko:

Przypadek 1 - plik2 = plik1 + dodatkowy tekst dołączony.

grep -Fxvf File2.txt plik1.txt >> File3.txt

Plik 1: 80 Linie pliku 2: 100 Lines pliku 3: 20 linii

Powiązane problemy