Tengo "test1.csv" y contiene
200,400,600,800
100,300,500,700
50,25,125,310
y test2.csv y contiene
100,4,2,1,7
200,400,600,800
21,22,23,24,25
50,25,125,310
50,25,700,5
ahora
diff test2.csv test1.csv > result.csv
es diferente a
diff test1.csv test2.csv > result.csv
No sé cuál es el orden correcto, pero quiero otra cosa, los dos comandos anteriores generarán algo como
2 > 100,4,2,1,7
3 2,3c3,5
4 < 100,300,500,700
5 < 50,25,125,310
6 \ No newline at end of file
7 ---
8 > 21,22,23,24,25
9 > 50,25,125,310
Quiero mostrar solo la diferencia, por lo tanto, results.csv debería verse así
100,300,500,700
100,4,2,1,7
21,22,23,24,25
50,25,700,5
Lo intenté diff -q
y diff -s
no hicieron el truco. El orden no importa, lo que importa es que solo quiero ver la diferencia, no> ni <ni espacio en blanco.
grep -FvF
hizo el truco en archivos más pequeños no en archivos grandes
El primer archivo contiene más de 5 millones de líneas, el segundo archivo contiene 1300.
entonces results.csv debería dar como resultado ~ 4,998,700 líneas
También probé grep -F -x -v -f
lo que no funcionó.
50,25,125,310
es común tanto a la necesidad de eliminar file..you que desde su salida deseada ..Respuestas:
Suena como un trabajo para
comm
:Como se explica en
man comm
:Por lo tanto,
-3
significa que solo se imprimirán las líneas que son exclusivas de uno de los archivos. Sin embargo, estos están sangrados según el archivo en el que se encontraron. Para eliminar la pestaña, use:En este caso, ni siquiera necesita ordenar los archivos y puede simplificar lo anterior para:
fuente
200,[...]
línea, ¿eh? :)Utilizando
grep
con labash
sustitución de procesos:Para guardar la salida como
results.csv
:<()
es el patrón de sustitución delbash
procesogrep -vFf test2.csv test1.csv
encontrará las líneas exclusivas de solotest1.csv
grep -vFf test1.csv test2.csv
encontrará las líneas exclusivas de solotest2.csv
Finalmente estamos resumiendo los resultados por
cat
O como sugirió Oli , puede usar la agrupación de comandos también:
O simplemente ejecute uno tras otro, ya que ambos escriben en STDOUT, finalmente se agregarán:
fuente
cat
dos comandos redirigidos? ¿Por qué no simplemente ejecutar uno y luego el otro?grep ... ; grep ...
o{ grep ... ; grep ... ; }
si quisieras hacer algo con la salida colectiva.Si el orden de las filas no es relevante, use
awk
operl
:Use
grep
para obtener las líneas comunes y filtrarlas:El grep interno obtiene las líneas comunes, luego el grep externo encuentra líneas que no coinciden con estas líneas comunes.
fuente
sort | uniq -u
, lo que da una respuesta incorrecta cuando un archivo contiene líneas duplicadas. Para grep, yo diría "interno" / "externo", no "interno" / "externo".awk
va a imprimir y lo que elcomm -3
ydiff
respuestas se imprimirá.comm -3
. No veo ninguna razón por la que deba explicar eso. Si desea editar en una nota, siéntase libre.Usa las
--*-line-format=...
opciones dediff
Puede decir
diff
exactamente lo que necesita, explicado a continuación:Es posible especificar la salida de diff de una manera muy detallada, similar a un
printf
formato de número.Las líneas del primer archivo
test1.csv
se denominan líneas "antiguas", y las líneas del segundotest2.csv
, son líneas "nuevas". Eso tiene sentido cuandodiff
se usa para ver qué cambió en un archivo.Las opciones que necesitamos son las que establecen el formato para las líneas "antiguas", las líneas "nuevas" y las líneas "sin cambios".
Los formatos que necesitamos son muy simples:
para las líneas cambiadas, nuevas y antiguas, queremos generar solo el texto de las líneas.
%L
es el símbolo de formato para el texto de línea.Para las líneas sin cambios, no queremos mostrar nada.
Con esto, podemos escribir opciones como
--old-line-format='%L'
, y ponerlo todo junto, usando sus datos de ejemplo:Notas sobre el rendimiento
Debido a que los archivos tienen un tamaño diferente, intente intercambiar los archivos de entrada si no importa, podría ser que el funcionamiento interno de se
diff
pueda manejar de una manera mejor que la otra. Mejor es necesitar menos memoria o menos cómputo.Hay una opción de optimización para el uso
diff
con archivos de gran tamaño:--speed-large-files
. Utiliza suposiciones sobre la estructura del archivo, por lo que no está claro si ayuda en su caso, pero vale la pena intentarlo.Las opciones de formato se describen en el
man diff
bajo--LTYPE-line-format=LFMT
.fuente
Dado que el pedido no necesita ser preservado, simplemente:
sort test1.csv test2.csv
: se fusiona y clasificatest1.csv
ytest2.csv
uniq -u
: imprime solo las líneas que no tienen duplicadofuente
diff
resultado.