es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para obtener el resultado deseado, puede modificar el comando diff de la siguiente manera:

    diff --new-line-format="joined %L" --old-line-format="left %L" \
    <(cut -f1,8 archivo1 | sort) <(cut -f1,8 archivo2 | sort) \
    | grep -E "^(joined|left)" \
    | awk '{print $2 "\t" $1}'
    

    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 comando cut a sort para ambos archivos, de manera que solo se mantengan las columnas que nos interesan (col1 y col8).

    Luego, redirigimos la salida del comando diff a grep 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 a awk 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:

    joined   Char5a    Char1
    left     Char5     Char1
    

Comments are closed.