比較兩個不同文件中的兩個欄位並在新文件中顯示輸出

比較兩個不同文件中的兩個欄位並在新文件中顯示輸出

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

我想比較 file1 和 file2 中的任務和狀態列,並在新文件中顯示資料以及任務和狀態以及字串,就好像它相等,如果不是“nok”則為“ok”

這是我嘗試過的,但它適用於 false 條件,但對於 true 也顯示 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

相關內容