Comparando dos archivos utilizando la primera columna, imprimir las diferencias mientras se adjunta la columna al resultado
Tengo dos archivos delimitados por tabulaciones que quiero comparar.
Quiero buscar los valores de la columna 1 en el archivo 1 que están faltando en el archivo 2 (añadiendo “left” al principio) y los valores de la columna 1 en el archivo 2 que están faltando en el archivo 1 (añadiendo “joined” al principio). Para estas líneas, quiero imprimir la columna 1 y la columna 8. Mi comando diff falla para las líneas con una columna 1 igual y valores diferentes para la columna 8.
archivo1:
Char1 55 Necromancer Knight A 11/21/21 Zone Char1(Main) off off 0 Char1(Main)
Char2 28 Druid Squire A 12/08/21 Zone Char1 off off 0 Char1<br>
Char3 44 Enchanter Recruit A 08/07/21 Zone Char3(Main) off off 0 Char3(Main)
Char4 56 Enchanter Knight A 11/06/21 Zone Char4(Main) off off 0 Char4(Main)
Char5 10 Magician Recruit A 10/29/21 Zone Char1 off off 0 Char1<br>
Char6 65 Druid Champion A 12/12/21 The Lair of the Splitpaw Char6(Main) VT emp time off off 0 Char6(Main) VT emp time
archivo2:
Char1 55 Necromancer Knight A 11/21/21 Zone Char1(Main) off off 0 Char1(Main)
Char2 28 Druid Squire A 12/08/21 Zone Char1 off off 0 Char1<br>
Char3 44 Enchanter Recruit A 08/07/21 Zone Char3(Main) off off 0 Char3(Main)
Char4 56 Enchanter Knight A 11/06/21 Zone Char4(Main) off off 0 Char4(Main)
Char5a 10 Magician Recruit A 10/29/21 Zone Char1 off off 0 Char1<br>
Char6 65 Druid Champion A 12/21/21 Zone Char6(Main) Emp/VT/Time off off 0 Char6(Main) Emp/VT/Time
Comando diff que produce la salida:
diff --new-line-format="joined %L" --old-line-format="left %L" --unchanged-line-format="" <(cut -f1,8 "$file1" | sort) <(cut -f1,8 "$file2" | sort) | sort
Salida actual:
joined Char5a Char1
joined Char6 Char6(Main) Emp/VT/Time
left Char5 Char1
left Char6 Char6(Main) VT emp time
Salida deseada:
joined Char5a Char1
left Char5 Char1
¡Cualquier ayuda es muy apreciada, gracias!
davy.ai
Para obtener el resultado deseado, puede modificar el comando diff de la siguiente manera:
Explicación:
El comando
diff
aún utiliza las opciones--new-line-format
y--old-line-format
para etiquetar las líneas en archivo1 y archivo2, respectivamente, que faltan en el otro archivo.Sin embargo, en lugar de usar
sort
para solo mostrar las diferencias, pasamos la salida del comandocut
asort
para ambos archivos, de manera que solo se mantengan las columnas que nos interesan (col1 y col8).Luego, redirigimos la salida del comando
diff
agrep
para mantener solo las líneas que comiencen con “joined” o “left”. Esto elimina cualquier línea donde col1 sea igual en ambos archivos.Finalmente, redirigimos la salida de
grep
aawk
para intercambiar el orden de los campos (col1 y “left” o “joined”) de manera que coincidan con el formato de salida deseado.El resultado obtenido es: