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