awk子替换中的奇怪行为

Nab*_*idu 2 bash shell scripting awk

我有一个字符串a

[root@rh-1 ~]# echo $a
4 11 10 7 11
Run Code Online (Sandbox Code Playgroud)

需要根据文件表中的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      ...  
Run Code Online (Sandbox Code Playgroud)

只要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); 
    } '
Run Code Online (Sandbox Code Playgroud)

上面的方法有效,但由于某种原因,在第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 ~]# 
Run Code Online (Sandbox Code Playgroud)

不知何故,只替换该特定线路是错误的.有人可以帮忙吗?

Joh*_*024 5

替换sub($NF,1)$NF=1.

sub($NF,1)使用$NF作为正则表达式和,为了在线路的第一次出现,它与替换1.自从$NF开始时0,这意味着该行中的第一个零被替换为一个.

相比之下,$NF=1仅将最后一列设置为一列.