2009-10-14 17 views
37

Potrzebuję pracować z dużymi plikami i muszę znaleźć różnice między dwoma. I nie potrzebuję różnych bitów, ale liczbę różnic.Jak liczyć różnice między dwoma plikami w systemie Linux?

Aby znaleźć liczbę różnych rzędów wymyślić

diff --suppress-common-lines --speed-large-files -y File1 File2 | wc -l 

I to działa, ale jest tam lepszy sposób to zrobić?

I jak policzyć dokładną liczbę różnic (przy użyciu standardowych narzędzi, takich jak bash, diff, awk, sed niektóre stare wersje perla)?

Odpowiedz

31
diff -U 0 file1 file2 | grep -v ^@ | wc -l 

To minus 2 dla dwóch nazw plików u góry listy diff. Format ujednolicony jest prawdopodobnie nieco szybszy niż format side-by-side.

+5

ten nie działa, jak zdefiniować „roboczy” http: // Pastie. org/pastes/3179433/text W każdym pliku jest tylko jeden znak, z czym wiąże się liczba "4"? –

+0

To działa. Dla przykładu masz cztery linie: pierwsze dwa to nazwy każdego pliku (jak wyjaśniono w odpowiedzi), a dwie pozostałe to dwie różnice, 1 linia z "a" usunięta i 1 linia z "b" dodane. –

+4

To zależy od tego, jak liczyć różnice. W tym przykładzie [pastie.org/5553254](http://pastie.org/5553254), uważam, że istnieją 2 linie, które różnią się, tj. Zgadzam się z sekwoją mcdowell. Niedogodne jest również odjęcie 2 od wyniku (z powodu drukowania 2 plików diff: ed). Dlatego uważam, że odpowiedź Josha jest właściwa. Można go nieznacznie skrócić za pomocą opcji -c (count) na grep, zamiast pipeline do wc -l, tak: 'diff -U 0 plik1 plik2 | grep -c^@ ' –

6

W przypadku korzystania z systemu Linux/Unix, a co comm -1 file1 file2 drukować linie plik1, które nie są w plik2, comm -1 file1 file2 | wc -l je policzyć, i podobnie dla comm -2 ...?

+0

Jak sureshw wskazuje w innej odpowiedzi, 'comm' spodziewa się jego argumenty mają być * sortowane * pliki. Tak więc na tę sugestię można polegać tylko w szczególnych przypadkach.(Myślę, że byłoby łatwo napisać własną wersję 'comm' przy użyciu awk, która działała również dla niesortowanego wejścia, ale wątpię, że to już spełnia ducha oryginalnego pytania.) – dubiousjim

40

Jeśli chcesz policzyć liczbę wierszy, które są różne zastosowanie to:

diff -U 0 file1 file2 | grep ^@ | wc -l 

nie Jana odpowiedź podwójnie policzyć różne linie?

+0

Tak, liczy się podwójnie. Zobacz mój komentarz dotyczący zaakceptowanej odpowiedzi. Polecenie w tej odpowiedzi jest poprawne. –

+2

Wydaje się to również potencjalnie podwójnie liczyć linie do mnie, zarówno na MacOSX i Ubuntu. Partie sąsiednich linii mogą być zgrupowane w jednym bloku, a to zależy od zadania, czy ma to być jedna różnica czy kilka. – khedron

+0

Nie zapomnij o kolorowych wyjściach oznacza, że ​​linie zaczynają się sekwencją specjalną! Musiał użyć hexdump, aby to wyliczyć. –

4

Od każdej linii wyjściowej, która różni się Rozpoczyna się < lub > charakter, chciałbym zaproponować to:

diff file1 file2 | grep ^[\>\<] | wc -l 

Używając tylko \< lub \> w linii skryptu można liczyć różnice tylko w jednym z tych plików.

+0

To podwójne liczy linie jako "<" and ">" może być wydrukowane dla tej samej linii . –

0

Jeśli masz do czynienia z plikami o analogicznej treści, które powinny być posortowane w tym samym wierszu dla linii (jak pliki CSV opisujące podobne rzeczy) i możesz np. Aby znaleźć 2 różnice w następujących plików:

File a: File b: 
min,max min,max 
1,5  2,5 
3,4  3,4 
-2,10  -1,1 

można wdrożyć go w Pythonie tak:

different_lines = 0 
with open(file1) as a, open(file2) as b: 
    for line in a: 
     other_line = b.readline() 
     if line != other_line: 
      different_lines += 1 
Powiązane problemy