比较两个不同文件中的两列并在新文件中显示输出

比较两个不同文件中的两列并在新文件中显示输出

文件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

我想比较文件 1 和文件 2 中的任务和状态列,并在新文件中显示任务和状态的数据,如果字符串相等则显示“ok”,如果不相等则显示“nok”

这是我尝试过的,但它在错误条件下有效,但在正确条件下它也显示错误。

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

相关内容