it-swarm-es.tech

Salida de las líneas comunes (similitudes) de dos archivos de texto (lo contrario de diff)?

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

Seudo 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.

23
maxschlepzig

¿Qué tal usar diff, aunque no quieras un diff? Prueba esto:

diff --unchanged-group-format='@@ %dn,%df 
  %<' --old-group-format='' --new-group-format='' \
  --changed-group-format='' a.txt b.txt

Esto es lo que obtengo con sus datos de muestra:

$ cat a.txt 
Foo Bar
X
Hello
World
42
$ cat b.txt 
Foo Baz
Hello
World
23
$ diff --unchanged-group-format='@@ %dn,%df
%<' --old-group-format='' --new-group-format='' \
  --changed-group-format='' a.txt b.txt
@@ 2,3
Hello
World
24
Mike Gray
grep -Fxf file1 file2

-F significa que coinciden las 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 argumento

15
tobyodavies

No creo que haya un solo comando que haga lo que quieres que haga. Sin embargo, puede intentar combinar la salida de diff con grep. Si sus archivos de texto no contienen ninguno de los caracteres |, <, >, lo siguiente le ofrece resultados algo útiles:

$ diff --side-by-side a b | grep -n -v "[|<>]"
3:Hello                             Hello
4:World                             World
8
Marcel Stimberg

comm se puede usar. man comm para todas las opciones pero querrás usar comm -12 ... para mostrar solo las líneas que existen en ambas entradas.

Como la gente ha señalado, primero debe pasar su entrada a través de sort.

7
Oli

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.

2
Douglas Bagnall