Comparando dos archivos campo por campo en Linux
Frecuentes
Visto 1,553 veces
0
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
2 Respuestas
1
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
1
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 linux awk or haz tu propia pregunta.
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) - Tesse M
Los campos 1, 2 y 5 del registro 1 en el archivo 1 coinciden todos las los registros en el expediente 2.- Dennis Williamson
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? - William Pursell