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 $1
Su campo clavefile2.txt
es$1
, no$2
.arr
Se 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 $2
entonces. 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