bash - awk 子替换中的奇怪行为

标签 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 ~]# 

不知何故,仅针对该特定线路的更换是有故障的。有人可以帮忙吗?

最佳答案

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/

相关文章:

linux - gnome-terminal 命令可以从命令行运行,但不能从 Cinnamon 快捷方式(或脚本)运行

linux - AWK 函数的问题

linux - 如何将值列表传递给脚本中的shell参数

bash - 如果字符串在同一行中匹配,则基于位置替换文本 block

awk - awk可以打印没有图案的行吗?

linux - 在Linux CLI中按位置替换特定行上的特定字符

mysql - cronjob mysql备份问题

在 C 中创建一个管道

linux - 如何在 Linux 中将天数转换为秒数

linux - 我可以等待不是当前 shell 终端子进程的进程终止吗?