arquivo1.txt
psid task status
1 a1 run
2 a2 run
3 a3 stop
4 a4 run
5 a5 stop
arquivo2.txt
a1 stop
a2 stop
a3 run
a4 run
a5 stop
saída -
task status ok
a1 run nok
a2 run nok
a3 stop nko
a4 run ok
a5 stop ok
Gostaria de comparar a coluna tarefa e status do arquivo1 e arquivo2 e exibir os dados em um novo arquivo com tarefa e status e a string como se fosse igual, então "ok" se não "nok"
Foi isso que tentei, mas está funcionando para condição falsa, mas para verdade também exibe falso.
awk -F, 'NR==FNR{ arr[$2]=$2 $1; next }
{ print $0, (arr[$2]==$2 $3?"ok":"nok") }' OFS=, file2.txt file1.txt
Responder1
Então, vamos dar uma olhada no que você tentou:
awk -F, 'NR==FNR{ arr[$2]=$2 $1; next }
{ print $0, (arr[$2]==$2 $3?"ok":"nok") }' OFS=, file2.txt file1.txt
-F,
define o delimitador de campo como vírgula, o que se você olhar seus arquivos está errado.arr[$2]=$2 $1
Seu campo-chavefile2.txt
é$1
, não$2
.- A ordem dos campos que você atribui ao seu
arr
é alterada. Na primeira parte você atribui$2 $1
, a segunda parte é$2 $3
, mas deveria ser$3 $2
então. Ou vice-versa, a primeira parte$1 $2
-
Maspor que não atribuir apenas o valor run/stop, isso deve ser suficiente!
Portanto, a versão funcional mais próxima da sua solução seria:
awk 'NR==FNR{ arr[$1]=$2 $1; next }
{ print $0, (arr[$2]==$3 $2?"ok":"nok") }' OFS=, file2.txt file1.txt
Mas eu diria isso:
awk '
NR==FNR{ arr[$1]=$2;next;}
FNR>2{ print $2,$3,(arr[$2]==$3?"ok":"nok") }
' file2.txt file1.txt