Tengo dos archivos planos A y B. A es un archivo grande que tiene millones de registros y se supone que B es un subconjunto de A. A tiene 20 columnas con una clave única y B tiene 5 columnas con la misma clave única. ¿Podría decirme cómo comparar B con A y averiguar si los registros presentes en el archivo B también están presentes en el Archivo A y tienen los mismos datos en las columnas respectivas?
Respuesta1
Creé dos archivos para demostrar mis comandos.
file1
:
1 a1 b1 c1 d1 e1
2 a2 b2 c2 d2 e2
3 a3 b3 c3 d3 e3
4 a4 b4 c4 d4 e4
5 a5 b5 c5 d5 e5
file2
:
2 b2 c2 e2
4 b4 c4 xx
5 b5 c5 e5
La primera columna es la clave única. Las columnas comunes son column b
y c
. e
Las filas comunes son 2
y . La fila tiene un valor diferente en la columna .4
5
4
e
Aquí está el comando con salida:
$ comm -1 -3 <(cut -d' ' -f1,3,4,6 file1) file2
4 b4 c4 xx
Si los archivos aún no están ordenados, puedes hacerlo así:
$ comm -1 -3 <(cut -d' ' -f1,3,4,6 file1 | sort) <(sort file2)
Explicación:
cut -d' ' -f1,3,4,6 file1
Imprima los campos número 1, 3, 4 y 6 del archivo. Los campos están separados por espacios. Si los campos están separados por comas, utilícelos cut
así:cut -d','
<( ... )
comm -1 -3 file1 file2
Imprime líneas exclusivas del archivo 2.
Advertencias:
cut
Tendrá problemas si el carácter separador puede aparecer como un carácter en un campo.
Por ejemplo:
"field1","field2,stillfield2","field3"
cut
No entenderá que la coma en "field2,stillfield2"
es parte del campo.
Si sus archivos son así, tal vez sea mejor utilizar un lenguaje de programación con manejo de CSV incorporado. Por ejemplopitón.
Respuesta2
Si los archivos tienen columnas diferentes como usted dice, la forma más sencilla podría ser escribir un pequeño programa utilizando el lenguaje de su elección. diff
y comm
no será de mucha ayuda si la estructura de líneas en los archivos no es idéntica.
Respuesta3
Aparte de la solución comm
y diff
que podrías utilizar grep
para esto.
Suponiendo que sus datos relevantes son las columnas 1,3 y 10 en el archivo A y 1,2 y 3 en el archivo B. Usamos cut
para seleccionar las columnas de A, usamos esto como archivo de coincidencia de palabras clave y verificamos su presencia en el archivo B. Si el archivo B tiene una línea que no está presente en las líneas coincidentes extraídas del archivo A, se mostrarán. Si todo coincide, no hay salida (ya que B supuestamente es un subconjunto de A)
grep -wvf <( cut -f1,3,10 fileA ) fileB
O si el archivo B tiene más de tres columnas:
grep -wvf <( cut -f1,3,10 fileA ) <( cut -f1,2,3 fileB )