awk子替换中的奇怪行为

时间:2014-09-12 01:29:27

标签: bash shell awk scripting

我有一个字符串

[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 ~]# 

以某种方式仅替换该特定线路是错误的。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:5)

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

sub($NF,1)使用$NF作为正则表达式,并且,对于该行中的第一个匹配项,它将替换为1。由于$NF0开头,这意味着该行中的第一个零被替换为一个。

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