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