Diff - отличный инструмент для отображения изменений между двумя файлами. Но как отобразить сходство двух текстовых файлов (при этом игнорируя различия)?
Т.е. пример ввода:
a:
Foo Bar
X
Hello
World
42
b:
Foo Baz
Hello
World
23
Псевдо-вывод (что-то вроде этого):
@@ 2,3
=Hello World
Недостаточно просто отсортировать оба файла и использовать comm, потому что в этом случае информация о строке теряется.
command-line
shell
diff
maxschlepzig
источник
источник
...%df'$'\n''%<'...
... --unchanged-group-format="@@ %dn,%df%c'\012'%<" ...
(Обратите внимание на двойные кавычки.)which diff
чтобы увидеть, если это ваша проблема.-F
означает совпадение простых строк (не регулярных выражений),-x
означает совпадение только с целыми строками ,-f
означает получение «шаблонов» (то есть строк) из файла, названного в качестве аргументаисточник
-f
и-F
обмен ?. По крайней мере, в моейgrep
версии это так. Мне нужно обеспечитьfile2
ввод-f
аргумента, какcat file1 | grep -Fxf file2
, и затем работает.comm
может быть использован.man comm
для всех опций, но вы хотите использовать,comm -12 ...
чтобы показать только линии, которые существуют в обоих входах.Как уже отмечали люди,
sort
сначала вам нужно пройти свой вклад .источник
Я не думаю, что есть одна команда, которая делает то, что вы хотите, чтобы она делала. Вы можете попытаться объединить вывод
diff
сgrep
, хотя. Если текстовые файлы не содержат ни один из символов|
,<
,>
следующие дает несколько полезного вывод:источник
diff --width=155 --left-column --side-by-side a b | grep -n -v '|' | sed 's/ *($//'
Дик Грун написал семейство инструментов для такого рода вещей:
http://dickgrune.com/Programs/similarity_tester/
Существуют версии, которые анализируют синтаксис различных языков, так что такие вещи, как переименованные переменные, могут рассматриваться как неизмененные.
Он упакован как
similarity-tester
в Debian и Ubuntu.источник