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.

Comparar dos archivos utilizando un script bash e imprimir un informe detallado de las diferencias.

Tengo 2 archivos grandes en un sistema Unix que tienen miles de filas y alrededor de 80 columnas cada uno. He ordenado los archivos según grupos de claves únicas para poder comparar siempre las mismas filas. Para facilitar la comprensión, aquí solo muestro 3 filas y 7 columnas.

Archivo 1:

d_report_ref_date="2021-03-31" system_id="VTX" contract_id="1130" credit_line_cd="ABC123" contract_id="ABC123" src_system_id="PRA" entity_cd="U0525"     
d_report_ref_date="2021-03-31" system_id="VTX" contract_id="1130" credit_line_cd="ABC124" contract_id="ABC124" src_system_id="PRA" entity_cd="U0526"     
d_report_ref_date="2021-03-31" system_id="VTX" contract_id="1130" credit_line_cd="ABC125" contract_id="ABC125" src_system_id="PRA" entity_cd="U0527" 

Archivo 2:

d_report_ref_date="2021-03-31" system_id="VTX" contract_id="1130" credit_line_cd="ABC123" contract_id="ABC123" src_system_id="PRA" entity_cd="U0525"     
d_report_ref_date="2021-03-31" system_id="VTX" contract_id="1130" credit_line_cd="ABC124" contract_id="ABC124" src_system_id="PRB" entity_cd="V0528"    
d_report_ref_date="2021-03-31" system_id="VTX" contract_id="1130" credit_line_cd="ABC125" contract_id="ABC125" src_system_id="PRA" entity_cd="U0530" 

Resultado esperado:

Desajuste en la fila 2: file1.src_system_id=PRA file2.src_system_id=PRB, file1.entity_cd=U0526 file2.entity_cd=V0528 

Desajuste en la fila 3: file1.entity_cd=U0527 file2.entity_cd=U0530

¿Es posible lograr esto mediante scripting de Bash? Intenté AWK, pero no me está dando el resultado deseado:

paste -d' ' file1 file2 | 
  awk -F' ' '{w=NF/2; 
              for(i=1;i<=w;i++) 
                 if($i!=$(i+w)) printf "%d %d %s %s,", NR,i,$i,$(i+w); 
              print ""}'

¡¡¡Gracias de antemano!!!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible lograr esto utilizando scripting en bash. Un enfoque podría ser utilizar el lenguaje de programación AWK con los siguientes pasos:

    1. Utilizar el comando paste para fusionar ambos archivos en uno, separados por un espacio.
    2. Utilizar AWK para comparar cada par de filas de los dos archivos.

    3. Verificar los valores clave que son comunes a ambas filas y las diferencias en las columnas restantes.

    4. Imprimir el número de fila, número de columna y el valor clave con la diferencia.

    Aquí hay un ejemplo de programa en AWK que logra la salida esperada:

    paste -d ' ' archivo1 archivo2 | awk -F ' ' '
    BEGIN {
        RS="\n"; FS="="; OFS="=";
        printf "Salida esperada: \n"
    }
    {
        # Extraer los valores clave
        clave=""
        for (i=1; i<=NF; i++)
            if ($i ~ /contract_id/ || $i ~ /credit_line_cd/ || $i ~ /entity_cd/)
                clave=clave "," $i
    
        # Comparar las filas de ambos archivos
        if (clave in filas)
        {
            for (i=1; i<=NF/2; i++)
            {
                if ($i != filas[clave,i])
                {
                    printf "Diferencia en fila %d: %s%s%s%s %s%s%s%s\n",
                        NR, "archivo1.", filas[clave,i], " archivo2.", $i, " archivo1.", filas[clave,i+NF/2], " archivo2.", $(i+NF/2)
                }
            }
        }
    
        # Guardar la fila en una tabla hash
        else
        {
            filas[clave,1]=""; filas[clave,2]=""; filas[clave,3]="";
            for (i=1; i<=NF/2; i++)
                filas[clave, i]=$i
        }
    }'
    

    Este script extrae los valores clave de cada fila para identificar cuáles son comunes a ambos archivos. Luego, compara las columnas restantes entre las dos filas, imprimiendo las diferencias en caso de una discrepancia. Finalmente, guarda la fila actual en una tabla hash para su posterior comparación.

    Nota: La salida de este script puede variar dependiendo de cómo se definan los valores clave o las columnas específicas que se están comparando, pero esto debería ser un buen punto de partida para sus necesidades.

Comments are closed.