Compare duas colunas de dois arquivos diferentes e exiba a saída em um novo arquivo

Compare duas colunas de dois arquivos diferentes e exiba a saída em um novo arquivo

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 $1Seu campo-chave file2.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 $2entã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

informação relacionada