Różnicowanie to świetne narzędzie do wyświetlania zmian między dwoma plikami. Ale jak wyświetlić podobieństwa dwóch plików tekstowych (ignorując różnice)?
Tzn. Przykładowe dane wejściowe:
a:
Foo Bar
X
Hello
World
42
b:
Foo Baz
Hello
World
23
Pseudo wyjście (coś takiego):
@@ 2,3
=Hello World
Samo sortowanie obu plików i używanie komunikatora nie wystarczy, ponieważ w takim przypadku informacje o linii zostaną utracone.
command-line
shell
diff
maxschlepzig
źródło
źródło
...%df'$'\n''%<'...
... --unchanged-group-format="@@ %dn,%df%c'\012'%<" ...
(Uwaga na podwójne cudzysłowy.)which diff
aby sprawdzić, czy to twój problem.-F
oznacza dopasowanie zwykłych ciągów (nie wyrażeń regularnych),-x
oznacza tylko dopasowania całej linii,-f
oznacza pobranie „wzorców” (tj. linii) z pliku o nazwie jako argumentźródło
-f
i-F
wymieniane ?. Tak przynajmniej jest w mojejgrep
wersji. Muszę podaćfile2
dane wejściowe do-f
argumentu, jakcat file1 | grep -Fxf file2
, a następnie działa.comm
może być użyte.man comm
dla wszystkich opcji, ale będziesz chciał użyć,comm -12 ...
aby wyświetlić tylko linie, które istnieją na obu wejściach.Jak zauważyli ludzie, najpierw musisz przekazać swoje uwagi
sort
.źródło
Nie sądzę, aby istniało jedno polecenie, które robi to, co chcesz. Możesz jednak spróbować połączyć wyjście
diff
zgrep
. Jeśli pliki tekstowe zawierają żadnego z bohaterów|
,<
,>
dodaje daje nieco przydatnych wyjście:źródło
diff --width=155 --left-column --side-by-side a b | grep -n -v '|' | sed 's/ *($//'
Dick Grune napisał rodzinę narzędzi do tego rodzaju rzeczy:
http://dickgrune.com/Programs/similarity_tester/
Istnieją wersje, które analizują składnię różnych języków, dzięki czemu zmienne o zmienionych nazwach mogą być postrzegane jako niezmienione.
Jest pakowany jak
similarity-tester
w Debianie i Ubuntu.źródło