我有一个字符串
[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 ~]#
不知何故,仅针对该特定线路的更换是有故障的。有人可以帮忙吗?
最佳答案
将 sub($NF,1)
替换为 $NF=1
。
sub($NF,1)
使用 $NF
作为正则表达式,并且对于该行中的第一次出现,它将替换为 1
.由于 $NF
开头为 0
,这意味着该行中的第一个零被替换为 1。
相比之下,$NF=1
只是将最后一列设置为 1。
关于bash - awk 子替换中的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25799391/