Сравнить два столбца из двух разных файлов и отобразить вывод в новом файле

Сравнить два столбца из двух разных файлов и отобразить вывод в новом файле

файл1.txt

psid   task   status 

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

файл2.txt

a1      stop
a2      stop
a3      run
a4      run 
a5      stop

выход -

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

Я хотел бы сравнить столбцы task и status из file1 и file2 и отобразить данные в новом файле с task и status и строкой так, как будто они равны, то «ok», если нет, то «nok».

Это то, что я попробовал, но это работает для ложного условия, но и для истинного тоже отображает false.

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

решение1

Итак, давайте посмотрим, что вы попробовали:

awk -F, 'NR==FNR{ arr[$2]=$2 $1; next }
{ print $0, (arr[$2]==$2 $3?"ok":"nok") }' OFS=, file2.txt file1.txt
  • -F,устанавливает разделитель полей на запятую, что, если вы посмотрите на свои файлы, неверно.
  • arr[$2]=$2 $1Ваше ключевое поле — file2.txt, $1а не $2.
  • Порядок полей, которые вы назначаете вашему, arrперепутан. В первой части вы назначаете $2 $1, вторая часть — $2 $3, но должно быть $3 $2тогда. Или наоборот, первая часть $1 $2
    Нопочему бы не назначить только значение запуска/остановки, этого должно быть достаточно!

Таким образом, наиболее близкой рабочей версией к вашему решению будет:

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

Но я бы выбрал вот это:

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

Связанный контент