Tengo una serie de archivos de texto para los que me gustaría conocer las líneas en común en lugar de las líneas que son diferentes entre ellos. La línea de comando unix o windows está bien.
foo:
linux-vdso.so.1 => (0x00007fffccffe000)
libvlc.so.2 => /usr/lib/libvlc.so.2 (0x00007f0dc4b0b000)
libvlccore.so.0 => /usr/lib/libvlccore.so.0 (0x00007f0dc483f000)
libc.so.6 => /lib/libc.so.6 (0x00007f0dc44cd000)
bar:
libkdeui.so.5 => /usr/lib/libkdeui.so.5 (0x00007f716ae22000)
libkio.so.5 => /usr/lib/libkio.so.5 (0x00007f716a96d000)
linux-vdso.so.1 => (0x00007fffccffe000)
Entonces, dados estos dos archivos por encima de la salida de la utilidad deseada, sería similar a file1:line_number, file2:line_number == matching text
(solo una sugerencia, realmente no me importa cuál es la sintaxis):
foo:1, bar:3 == linux-vdso.so.1 => (0x00007fffccffe000)
Gracias.
command-line
diff
wilkie mate
fuente
fuente
Respuestas:
En * nix, puede usar comm . La respuesta a la pregunta es:
Aquí está el uso completo de
comm
:También tenga en cuenta que es importante ordenar los archivos antes de usar comm, como se menciona en las páginas del manual.
fuente
Encontré esta respuesta en una pregunta que figura como duplicado . Creo que grep es más amigable para el administrador que la comunicación, por lo que si solo desea el conjunto de líneas coincidentes (por ejemplo, útil para comparar CSV) simplemente use
o la versión simplificada de fgrep
Además, puede usar
file2*
para buscar y buscar líneas en común con múltiples archivos, en lugar de solo dos.Algunas otras variaciones prácticas incluyen
-n
marca para mostrar el número de línea de cada línea coincidente-c
para contar solo el número de líneas que coinciden-v
para mostrar solo las líneas en el archivo 2 que difieren (o usandiff
).El uso
comm
es más rápido, pero esa velocidad se produce a expensas de tener que ordenar primero los archivos. No es muy útil como 'diff inverso'.fuente
-v
bandera después de que yo misma me deslicé. Supongamos que tiene dos archivos csv, archivo1 y archivo2, y que tienen filas superpuestas y no superpuestas. Si desea todas y solo las filas no superpuestas, el usofgrep -v file1 file2
solo devolverá las filas no superpuestas en el archivo2, y ninguna de las filas adicionales no superpuestas en el archivo1 . Esto puede ser obvio para algunos, pero es mejor decir lo obvio que la mala interpretación del riesgo. En este caso particular, ordenar los archivos y usarloscomm
sigue siendo la mejor opción.grep
: cualquier línea en blanco en el primer archivo coincidirá con cada línea en el segundo archivo. Asegúrese de quefile1
no tenga líneas en blanco, o parecerá que los archivos son idénticos.grep -Fxf
es para mi.Se le preguntó aquí antes: comando Unix para encontrar líneas comunes en dos archivos
También puedes probar con perl (el crédito va aquí )
fuente
comm
no estaba disponible. Esta fue la alternativa perfecta.Acabo de aprender el comando de comunicación de este hilo, pero quería agregar algo extra: si los archivos no están ordenados y no desea tocar los archivos originales, puede canalizar la salida del comando de clasificación. Esto deja los archivos originales intactos. Funciona en bash, no puedo decir sobre otras conchas.
Esto se puede extender para comparar la salida del comando, en lugar de los archivos:
fuente
La forma más fácil de hacerlo es:
No es necesario ordenar los archivos.
fuente
Solo para información, creé una pequeña herramienta para Windows que hace lo mismo que "grep -F -x -f file1 file2" (ya que no he encontrado nada equivalente a este comando en Windows)
Aquí está: http://www.nerdzcore.com/?page=commonlines
El uso es "CommonLines inputFile1 inputFile2 outputFile"
El código fuente también está disponible (GPL)
fuente
En Windows puede usar un Script Powershell con CompareObject
CompareObject:
fuente