Comparando dos archivos campo por campo en Linux

Estoy tratando de comparar dos archivos (separados por coma y espacio) usando 3 campos (campo 1,2, 5, 1 del archivo 1,2,5 y 2, 2, 1 del archivo 1) si los dos archivos coinciden, quiero el registro completo del archivo XNUMX concatenado con el último archivo del archivo XNUMX usando awk. por ejemplo archivoXNUMX:

1, 4, abebe, kebede, 25, 101, 42
1, 4, abebe, debebe, 42, 201, 47
1, 4, abebech, kebede, 17, 33, 57

archivo2:

1, 4, abebe, kebede, 25, 101, 42
1, 4, Tesse, debo, 25, 101, 42
1, 4, derartu, tulu, 25, 101, 42

salida:

42, 1, 4, abebe, kebede, 25, 101, 42
47, 1, 4, Tesse, debo, 25, 101, 42
57, 1, 4, derartu, tulu, 25, 101, 42

soy nuevo en linux... cualquier ayuda es apreciada

preguntado el 12 de junio de 12 a las 17:06

los archivos son file1: 1, 4, abebe, kebede, 25, 101, 42 (rec1) 1, 4, abebe, debebe, 42, 201, 47(rec2) 1, 4, abebech, kebede, 17, 33, 42 (rec3) file2: 1, 4, abebe, kebede, 25, 101, 42 (rec1) 1, 4, Tesse, debo, 25, 101, 42(rec2) 1, 4, derartu, tulu, 25, 101, 42 (rec3) -

Los campos 1, 2 y 5 del registro 1 en el archivo 1 coinciden todos las los registros en el expediente 2.-

Su resultado no coincide con la descripción del problema. Todos los registros en el archivo 2 coinciden con los campos 1,4,25, 1, 42 del primer registro en el archivo 4, por lo que todas las líneas de su salida deben comenzar con 5. ¿Realmente le importa el campo XNUMX en lugar del campo XNUMX? -

2 Respuestas

Mi primera lectura del problema se presta a esta solución:

awk '{getline t < "file2"; split( t, a );
    if( a[1]a[2]a[5] == $1$2$5) print $NF",", t}' file1

Pero parece que la pregunta es en realidad: 'Dado file1 en el que sabemos que cualquier registro en el que los campos 1, 2 y 4 son iguales, el campo final también es el mismo, encuentre todas las líneas en file2 con los campos correspondientes 1, 2 y 4 y generar esa línea con el campo final de file1 antepuesto En cuyo caso, la solución dada por Dennis funciona.

Respondido el 12 de junio de 12 a las 18:06

Eso hace una comparación línea por línea, sin embargo, el OP no especificó si las líneas de los dos archivos se correspondían o si un archivo tenía más líneas que el otro. - dennis williamson

@Dennis, de hecho, la especificación de la pregunta es vaga. - Guillermo Pursell

el número de registros en los archivos es diferente - tesse m

Esto funciona perfectamente para la comparación línea por línea. Pero, ¿qué pasa si quiero buscar cada registro del primer archivo en el segundo archivo e imprimirlo si obtengo una coincidencia? - tesse m

Dado que los campos 1, 2 y 5 del registro 1 en el archivo 1 coinciden todos las los registros en el archivo 2 He enumerado los archivos como argumentos en el orden opuesto para obtener el resultado que desea.

awk 'BEGIN {OFS = ", "} NR == FNR {a[$1, $2, $5] = $NF; next} $1 SUBSEP $2 SUBSEP $5 in a {print a[$1, $2, $5], $0}' file2 file1

La NR == FNR block forma un bucle que lee el archivo que aparece primero en la lista de argumentos en una matriz. Cuando el número de registro (NR) y el número de registro del archivo (FNR) ya no son iguales, el procesamiento continúa hasta el archivo que se nombra como el segundo argumento.

Allí, se comprueba la matriz para ver si los campos de los dos archivos coinciden. Si es así, se emiten el campo guardado correspondiente y el registro actual.

Respondido el 13 de junio de 12 a las 11:06

Necesito el programa para comparar línea por línea. línea uno del archivo1 con la línea correspondiente del archivo2. El número de registros en los dos archivos es diferente: tesse m

Si el número de líneas en los archivos es diferente, ¿qué quiere decir con "la línea correspondiente"? - Guillermo Pursell

@WilliamPursell: la línea que tiene $1 SUBSEP $2 SUBSEP $5 in a. En otras palabras, los campos 1, 2 y 5 coinciden entre los dos archivos independientemente del número de registros en cada archivo. Su orden relativo o absoluto no es importante (no están ordenados). - dennis williamson

@WilliamPurse: leerá línea por línea de los dos archivos y comparará las dos líneas: tesse m

@TesseM: Sin embargo, no lee los dos archivos al mismo tiempo. Lee todo un archivo y luego todo el otro. - dennis williamson

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.