файл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