我有一个字符串
[root@rh-1 ~]# echo $a
4 11 10 7 11
需要根据文件表
中的id字段检查这组值[root@rh-1 ~]# cat table
id name inuse rules
1 Critical data 0 ...
2 Important data 0 ...
3 Normal data 0 ...
4 nc-test 0 ...
5 schedule one 0 ...
7 foo sc2 0 ...
8 foo sc3 0 ...
9 foo-sc4 0 ...
10 foo_sc5 0 ...
11 foosc6 0 ...
如果id是$ a中的一个数字,我需要将inuse列的值替换为1.可以丢弃规则列
[root@rh-1 ~]# cat table | awk -v a="$a" ' {
split(a,sid," "); NF=NF-1;}
{ $NF=0;n=length(sid);
for (i=1;i<n;i++)
{ if($1 == sid[i]){
sub($NF,1);
break;
}
}
if($1=="id")
print("mid name InUse" );
else
printf("%-25s\n",$0);
} '
上述方法有效,但出于某种原因,在这一行中 10 foo_sc5 而不是在最后替换0, 至 10 foo_sc5 1 它取代了 11 foo_sc5 0
而所有其他人都被正确替换。
mid name InUse
1 Critical data 0
2 Important data 0
3 Normal data 0
4 nc-test 1
5 schedule one 0
7 foo sc2 1
8 foo sc3 0
9 foo-sc4 0
11 foo_sc5 0
11 foosc6 1
[root@rh-1 ~]#
以某种方式仅替换该特定线路是错误的。有人可以帮忙吗?
答案 0 :(得分:5)
将sub($NF,1)
替换为$NF=1
。
sub($NF,1)
使用$NF
作为正则表达式,并且,对于该行中的第一个匹配项,它将替换为1
。由于$NF
以0
开头,这意味着该行中的第一个零被替换为一个。
相比之下,$NF=1
仅将最后一列设置为一个。