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