Bash awk接头更换中的奇怪行为

Bash awk接头更换中的奇怪行为,bash,shell,awk,scripting,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

我有一根绳子

[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。可以丢弃rules列

[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); 
    } '
不知何故,仅更换该特定线路是有故障的。有人能帮忙吗?

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

sub($NF,1)
使用
$NF
作为正则表达式,对于行中的第一次出现,它将替换为
1
。由于
$NF
0
开头,这意味着行中的第一个零将替换为一


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

顺便说一句,您应该在
开始
块中执行
拆分
一次,而不是每行。最好将
a
的元素转换为关联数组的键,而不是常规数组的值——然后您可以使用
if($1 in sid)
是否希望输出像这样被破坏(与输入相比)?因为如果您愿意,您完全可以在适当的位置更改字段。@EtanReisner按照John的建议在适当的位置更改还是其他什么?我没有关于输出对齐的任何规范。任何看起来最好的,都能完美地工作。这个解释很有道理。谢谢
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 ~]#