Usando awk/for/grep para comparar 2 archivos

Usando awk/for/grep para comparar 2 archivos

Tengo 2 archivos csv cuyo contenido es-

expo1.csv:

102,GRAN,adjetivo,ESP,p1_0,no,p2_1,no,p3,no,4,si,p5_2,no,p6,si....,su1,amb,su_09,no

104,BHAAG,verbo,HIN,p1,sí,p2,no,p3_7,amb,p4,no,p5,no,p6_9,sí....,sg4_3,sí,su119,amb

110,.......,su11_0,amb

y impo1.csv:

104,p1,no
102,p2,yes
104,p10,no
110,su11,no

Básicamente expo1.csves un archivo en el servidor y impo1.csves un archivo que creé para actualizar expo1.csv. Un script realiza los cambios expo1.csvcomo se especifica en impo1.csvdespués de realizar un ligero procesamiento en los datos de impo1 (por ejemplo, la línea 102,p2,yes from impo1.csvse procesa y luego se realiza una actualización a expo1.csv- p2_1,yes).

expo1.csvdespués de los cambios:

102,GRAN,adjetivo,ESP,p1_0,no,p2_1,si,p3,no,4,si,p5_2,no,p6,si....,su1,amb,su_09,no

104,BHAAG,verbo,HIN,p1,no,p2,no,p3_7,amb,p4,no,p5,no,p6_9,sí....,sg4_3,sí,su119,amb

110,.........,su11_0,no

Ahora, después de que el script realice los cambios, debemos validar si los cambios se realizaron correctamente comparando los archivos impo1 y expo1. Aquí es donde estoy estancado.

Hasta ahora pude aislar los datos entre comas impo1.csvpor separado en variables usando awk:

Sno=104 102 104
Posw=p1 p2 p10
cho=no yes no

Ahora la pregunta es, ¿cómo puedo comprobar esto? Los impo1.csvarchivos contienen alrededor de 3000 actualizaciones. Si lo hago grep p1 expo1.csv|grep no expo1.csv, obviamente no devolverá el resultado correcto ya que el archivo tiene muchas cadenas 'no'. Intenté usar un bucle for para separar los datos awken variables separadas y luego grep usando un comodín, grep sno expo1.csv|grep '/<$posw.*,$cho>/' expo1.csvpero no funciona.

Usando GNU bash 4.1.2.

EDITAR: Debería haber mencionado esto antes, lo malo: no hay patrones claros en el archivo impo1.csv que pueda usar para verificar el archivo expo1. He realizado correcciones al contenido del archivo de muestra que ilustran mi punto.

Respuesta1

La solución es bastante sencilla. Solo necesita crear un patrón a partir de cada línea impo1.csvy luego grephacerlo expo1.csvdespués de la actualización.

validate() {
    # $1 ~ impo1.csv
    # $2 ~ expo1.csv after changes
    while read pattern; do
        grep -q "^$pattern" $2 || return 1
    done < <(sed "s/,/,.*/" $1 )
}

Respuesta2

awk -F, '
    NR==FNR{
        for(i=1;i<NF;i)
            DATA[$1 SUBSEP $++i] = $++i;
        next
    }
    DATA[$1 SUBSEP $2] != $3
    ' expo1.csv impo1.csv

imprimirá líneas impo1.csvque son diferentes a los datos enexpo1.csv

información relacionada