command-line - online - linux difference in files
cómo mostrar líneas en común(diff inverso)? (6)
Acabo de aprender el comando de comunicación de este hilo, pero quería agregar algo adicional: si los archivos no están ordenados, y no desea tocar los archivos originales, puede canalizar la salida del comando ordenar. Esto deja intactos los archivos originales. Funciona en bash, no puedo decir sobre otras conchas.
comm -1 -2 <(sort file1) <(sort file2)
Esto se puede extender para comparar salida de comando, en lugar de archivos:
comm -1 -2 <(ls /dir1 | sort) <(ls /dir2 | sort)
Tengo una serie de archivos de texto para los cuales me gustaría saber las líneas en común en lugar de las líneas que son diferentes entre ellos. La línea de comandos 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 arriba, 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.
En * nix, puede usar comm . La respuesta a la pregunta es:
comm -1 -2 file1.sorted file2.sorted
# where file1 and file2 are sorted and piped into *.sorted
Aquí está el uso completo de comm
:
comm [-1] [-2] [-3 ] file1 file2
-1 Suppress the output column of lines unique to file1.
-2 Suppress the output column of lines unique to file2.
-3 Suppress the output column of lines duplicated in file1 and file2.
También tenga en cuenta que es importante ordenar los archivos antes de usar comm, como se menciona en las páginas man.
Encontré esta respuesta en una pregunta que figura como un duplicado . Me parece que grep es más amigable para el administrador que comm, así que si solo quieres el conjunto de líneas que coincidan (útil para comparar CSV, por ejemplo) simplemente usa
grep -F -x -f file1 file2
o la versión fgrep simplificada
fgrep -xf file1 file2
Además, puede usar file2*
para glob y buscar líneas en común con varios archivos, en lugar de solo dos.
Algunas otras variaciones útiles incluyen
-
-n
Indicador 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 archivo2 que difieren (o usandiff
).
Usar comm
es más rápido, pero esa velocidad se produce a expensas de tener que ordenar primero tus archivos. No es muy útil como una "diferencia inversa".
La forma más fácil de hacerlo es:
awk ''NR==FNR{a[$1]++;next} a[$1] '' file1 file2
Los archivos no son necesarios para ser ordenados.
Me preguntaron aquí antes: comando Unix para encontrar líneas comunes en dos archivos
También puedes probar con Perl (el crédito va aquí )
perl -ne ''print if ($seen{$_} .= @ARGV) =~ /10$/'' file1 file2
Solo como información, hice una pequeña herramienta para Windows que hace lo mismo que "grep -F -x -f archivo1 archivo2" (Como 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)