Odpowiedzi:
Najbardziej oczywistą odpowiedzią jest użycie polecenia diff i prawdopodobnie dobrym pomysłem jest dodanie do niego parametru --speed-large-files.
diff --speed-large-files a.file b.file
Wspominasz o nieposortowanych plikach, więc może najpierw musisz je posortować
sort a.file > a.file.sorted
sort b.file > b.file.sorted
diff --speed-large-files a.file.sorted b.file.sorted
możesz zapisać tworzenie dodatkowego pliku wyjściowego, przesyłając dane wyjściowe 2. sortowania bezpośrednio do pliku różnicowego
sort a.file > a.file.sorted
sort b.file | diff --speed-large-files a.file.sorted -
Oczywiście będą działać najlepiej w systemie z dużą ilością dostępnej pamięci i prawdopodobnie będziesz potrzebować dużo wolnego miejsca na dysku.
Z twojego pytania nie było jasne, czy próbowałeś ich już wcześniej. Jeśli tak, to warto wiedzieć, co poszło nie tak (zajęło to zbyt wiele czasu itp.). Zawsze odkryłem, że polecenia sortowania i porównywania zapasów zwykle wykonują co najmniej tak samo, jak polecenia niestandardowe, chyba że istnieją pewne bardzo specyficzne dla domeny właściwości plików, które pozwalają robić różne rzeczy.
diff <(command 1) <(command 2)
<(cmd1) <(cmd2)
działa składnia (ponieważ brzmi to jak dwukierunkowe przekierowanie standardowego wejścia!), Spróbuj echo hello <(cmd1) <(cmd2)
. Zobaczysz coś, hello /dev/fd/63 /dev/fd/62
co nagle wyjaśnia;)
--speed-large-files
wynika , że ta opcja nie pomaga, jeśli nie masz wystarczającej ilości pamięci RAM. Ponadto wstępne sortowanie nie jest pomocne, jeśli masz wielowierszową strukturę rekordów, którą chcesz zachować. Opcje, o których mowa powyżej (przez @unhammer) są interesujące, ale wyjście z rdiff
i bsdiff
jest raczej binarny. Instalacja bdiff
z Heirloom Toolbox wygląda jak zadanie dostrajania (wymaga devtools Heirloom, wymarłych plików nagłówkowych,…). Czy to naprawdę warte wysiłku? Czy są inne alternatywy?
Sortowanie danych wejściowych i informowanie diff
programu, że dane wejściowe są sortowane, zapewni ogromne przyspieszenie. Nie znam żadnej diff
z taką opcją, ale comm
zakłada posortowane dane wejściowe i będzie znacznie szybsze, jeśli wystarczy dla twoich celów.
comm
działał świetnie do tego, nigdy wcześniej o nim nie słyszałem, ale najwyraźniej jest w coreutils.
mkfifo
aby utworzyć[ab].file.sorted
przed użyciem ich jako danych wyjściowychsort
. Umieść obasort
s&
w tle i użyj obu potoków jako nazw plików dla diff.