
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.csv
es un archivo en el servidor y impo1.csv
es un archivo que creé para actualizar expo1.csv
. Un script realiza los cambios expo1.csv
como se especifica en impo1.csv
después de realizar un ligero procesamiento en los datos de impo1 (por ejemplo, la línea 102,p2,yes from impo1.csv
se procesa y luego se realiza una actualización a expo1.csv
- p2_1,yes
).
expo1.csv
despué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.csv
por 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.csv
archivos 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 awk
en variables separadas y luego grep usando un comodín, grep sno expo1.csv|grep '/<$posw.*,$cho>/' expo1.csv
pero 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.csv
y luego grep
hacerlo expo1.csv
despué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.csv
que son diferentes a los datos enexpo1.csv