Diff es una gran herramienta para mostrar los cambios entre dos archivos. Pero, ¿cómo mostrar las similitudes de dos archivos de texto (sin tener en cuenta las diferencias)?
Es decir, entrada de muestra:
a:
Foo Bar
X
Hello
World
42
b:
Foo Baz
Hello
World
23
Pseudo salida (algo como esto):
@@ 2,3
=Hello World
Simplemente ordenar ambos archivos y usar comm no es suficiente, porque en ese caso se pierde la información de la línea.
command-line
shell
diff
maxschlepzig
fuente
fuente
...%df'$'\n''%<'...
... --unchanged-group-format="@@ %dn,%df%c'\012'%<" ...
(Tenga en cuenta las comillas dobles.)which diff
para ver si este es su problema.-F
significa emparejar cadenas simples (no expresiones regulares),-x
significa solo coincidencias de línea completa,-f
significa tomar 'patrones' (es decir, líneas) del archivo nombrado como argumentofuente
-f
e-F
intercambiados ?. Al menos en migrep
versión es así. Necesito proporcionarfile2
información al-f
argumento, comocat file1 | grep -Fxf file2
, y luego funciona.comm
puede ser usado.man comm
para todas las opciones, pero querrá usarcomm -12 ...
para mostrar solo las líneas que existen en ambas entradas.Como la gente ha señalado,
sort
primero debe pasar su opinión .fuente
No creo que haya un solo comando que haga lo que quieres que haga. Sin embargo, puede intentar combinar la salida de
diff
congrep
. Si sus archivos de texto contienen ninguno de los personajes|
,<
,>
, el siguiente le da salida de cierta utilidad:fuente
diff --width=155 --left-column --side-by-side a b | grep -n -v '|' | sed 's/ *($//'
Dick Grune escribió una familia de herramientas para este tipo de cosas:
http://dickgrune.com/Programs/similarity_tester/
Hay versiones que analizan la sintaxis de varios idiomas, de modo que cosas como las variables renombradas pueden verse sin cambios.
Está empaquetado como
similarity-tester
en Debian y Ubuntu.fuente