¿Cómo comparar dos columnas de dos archivos csv con awk?

Sep 02 2020

Tengo dos archivos csv que necesito comparar con una columna.

Mi member.csvarchivo se ve así:

ID|lastName|firstName
01|Lastname01|Firstname01
02|Lastname02|Firstname02

El segundo archivo se check-ID.csvparece a:

Lastname01|Name01|pubID01|Hash01
Lastname02|Name02|pubID02|Hash02a
Lastname03|Name03|pubID03|Hash03
Lastname02|Name02|pubID02|Hash02b
Lastname01|Name01|pubID01|Hash01b

-> Lastname03no esta en mi member.csv!

Lo que quiero es verificar si el valor de la primera columna de check-ID.csves igual al valor de la segunda columna en member.csv.

Mi intento con script.awkes

NR==FNR{a[$1]=$1; b[$1]=$0; next} 
$2==a[$1]{ delete b[$1]}

END{for (i in b ) print b[i]}

ejecutando con

awk -f script.awk check-ID.csv member.csv

El problema es que el resultado no se filtra.

Me gusta obtener una salida filtrada y ordenada, por lo que solo los miembros se enumeran así:

Lastname01|Name01|pubID01|Hash01
Lastname01|Name01|pubID01|Hash01b
Lastname02|Name02|pubID02|Hash02a
Lastname02|Name02|pubID02|Hash02b

¡Cualquier ayuda apreciada!

Respuestas

3 RavinderSingh13 Sep 02 2020 at 09:14

¿Podría intentar seguirlo? Creo que estuvo cerca, lo único que podría cambiar es la secuencia de lectura de Input_files. Donde estoy leyendo membersInput_file primero y luego check-ID.csvporque luego Input_file tiene todos los detalles que deben imprimirse y solo necesitamos verificar el segundo campo de los miembros Input_file.

awk '
BEGIN{
  FS="|"
}
FNR==NR{
  a[$2] next } ($1 in a)
' members.csv check-ID.csv | 
sort -t'|' -k1

Explicación: agregando una explicación detallada de lo anterior.

awk '                             ##Starting awk program from here.
BEGIN{                            ##Starting BEGIN section of this program from here.
  FS="|"                          ##Setting field separator as | here.
}
FNR==NR{                          ##Checking condition if FNR==NR which will be TRUE when first Input_file named members.csv is being read.
  a[$2] ##Creating array a with index 2nd field here. next ##next will skip all further statements from here. } ($1 in a)                         ##Checking condition if 1st field is preent in a then print that line.
' members.csv check-ID.csv |      ##Mentioning Input_file names here and sending its output to sort command.
sort -t'|' -k1                    ##Sorting output(which we got from awk command above) by setting separator as | and by first field.