Istnieją dwa pliki o nazwach „a.txt” i „b.txt”, oba zawierają listę słów. Teraz chcę sprawdzić, które słowa są dodatkowe w „a.txt”, a których nie ma w „b.txt” .
Potrzebuję wydajnego algorytmu, ponieważ muszę porównać dwa słowniki.
linux
terminal
diff
file-comparison
Ali Imran
źródło
źródło
diff a.txt b.txt
nie wystarcza?Odpowiedzi:
jeśli masz zainstalowany vim, spróbuj tego:
lub
uznasz to za fantastyczne.
źródło
Sortuj je i używaj
comm
:comm
porównuje (posortowane) pliki wejściowe i domyślnie wyświetla trzy kolumny: wiersze, które są unikalne dla a, wiersze unikalne dla b i wiersze, które są obecne w obu. Określając-1
,-2
i / lub-3
można stłumić odpowiednie wyjście. Dlategocomm -23 a b
wyświetla tylko wpisy, które są unikalne dla. Używam<(...)
składni do sortowania plików w locie, jeśli są już posortowane, nie potrzebujesz tego.źródło
comm
jest bardziej wydajny, ponieważ wykonuje zadanie w jednym przebiegu, bez przechowywania całego pliku w pamięci. Ponieważ używasz słowników, które najprawdopodobniej są już posortowane, nawetsort
ich nie potrzebujesz . Użyciegrep -f file1 file2
z drugiej strony załaduje całośćfile1
do pamięci i porówna każdą linięfile2
ze wszystkimi tymi wpisami, co jest znacznie mniej wydajne. Jest to przydatne głównie w przypadku małych, nieposortowanych-f file1
.\n
będzie on również uwzględniony podczas porównywania.Spróbuj
sdiff
(man sdiff
)źródło
Możesz użyć
diff
narzędzia w systemie Linux, aby porównać dwa pliki. Możesz użyć opcji --changed-group-format i --unchanged-group-format do filtrowania wymaganych danych.Aby wybrać odpowiednią grupę dla każdej opcji, można skorzystać z trzech opcji:
'% <' pobiera wiersze z PLIKU1
'%>' pobiera linie z PLIKU2
'' (pusty ciąg) do usuwania linii z obu plików.
źródło
Jeśli wolisz styl wyjściowy diff z
git diff
, możesz użyć go z--no-index
flagą, aby porównać pliki spoza repozytorium git:Używając kilku plików z około 200k ciągami nazw plików w każdym, porównałem (za pomocą wbudowanego
time
polecenia) to podejście w porównaniu z niektórymi innymi odpowiedziami tutaj:comm
wydaje się być najszybszym jak dotąd, podczas gdygit diff --no-index
wydaje się być najszybszym podejściem do wyjścia w stylu diff.Aktualizacja 2018-03-25 W rzeczywistości możesz pominąć
--no-index
flagę, chyba że jesteś w repozytorium git i chcesz porównać nieśledzone pliki w tym repozytorium. Ze stron podręcznika :źródło
Możesz także użyć: colordiff : Wyświetla wynik diff z kolorami.
O vimdiff : Umożliwia porównywanie plików przez SSH, na przykład:
Pobrano z: http://www.sysadmit.com/2016/05/linux-diferencias-entre-dos-archivos.html
źródło
Nie zapomnij także o mcdiff - wewnętrznej przeglądarce różnic w GNU Midnight Commander .
Na przykład:
Cieszyć się!
źródło
Użyj
comm -13
(wymaga posortowanych plików) :źródło
Oto moje rozwiązanie:
źródło
sdiff -s file1 file2
była przydatna.Używanie do tego awk. Pliki testowe:
Awk:
Wyprowadzane są duplikaty:
Aby uniknąć duplikatów, dodaj każde nowo poznane słowo w pliku.txt do
seen
krzyżyka:Wynik:
Jeśli listy słów są oddzielone przecinkami, na przykład:
musisz zrobić kilka dodatkowych okrążeń (
for
pętli):Wyjście tym razem:
źródło