Compare dos columnas de dos archivos diferentes y muestre el resultado en un archivo nuevo

Compare dos columnas de dos archivos diferentes y muestre el resultado en un archivo nuevo

archivo1.txt

psid   task   status 

1       a1      run
2       a2      run
3       a3      stop
4       a4      run     
5       a5      stop

archivo2.txt

a1      stop
a2      stop
a3      run
a4      run 
a5      stop

producción -

task    status      ok
a1      run         nok
a2      run         nok
a3      stop        nko
a4      run         ok  
a5      stop        ok

Me gustaría comparar la columna de tarea y estado del archivo 1 y el archivo 2 y mostrar datos en un archivo nuevo con la tarea, el estado y la cadena como si fuera igual, entonces "ok" si no "nok".

Esto es lo que intenté, pero funciona para la condición falsa, pero para la condición verdadera también muestra falso.

awk -F, 'NR==FNR{ arr[$2]=$2 $1; next } 
{ print $0, (arr[$2]==$2 $3?"ok":"nok") }' OFS=, file2.txt file1.txt

Respuesta1

Entonces, echemos un vistazo a lo que probaste:

awk -F, 'NR==FNR{ arr[$2]=$2 $1; next }
{ print $0, (arr[$2]==$2 $3?"ok":"nok") }' OFS=, file2.txt file1.txt
  • -F,establece el delimitador de campo en coma, lo cual si observa sus archivos es incorrecto.
  • arr[$2]=$2 $1Su campo clave file2.txtes $1, no $2.
  • arrSe cambia el orden de los campos que asigna . En la primera parte usted asigna $2 $1, la segunda parte es $2 $3, pero debería ser $3 $2entonces. O viceversa, la primera parte $1 $2...
    Pero¿Por qué no asignar solo el valor de ejecución/parada? ¡Eso debería ser suficiente!

Entonces, la versión funcional más cercana a su solución sería:

awk 'NR==FNR{ arr[$1]=$2 $1; next }
{ print $0, (arr[$2]==$3 $2?"ok":"nok") }' OFS=, file2.txt file1.txt

Pero yo iría con esto:

awk '
    NR==FNR{ arr[$1]=$2;next;}
    FNR>2{ print $2,$3,(arr[$2]==$3?"ok":"nok") }
 ' file2.txt file1.txt

información relacionada