修改字段或NF值的联动效应
注意下面的分割和计算两词:分割表示使用FS(field Separator),计算表示使用预定义变量OFS(Output Field Separator)。
修改$0,将使用FS重新分割字段,所以会影响$1、$2...
修改$1、$2,将根据$1到$NF等各字段来重新计算$0
即使是$1 = $1这样的原值不变的修改,也一样会重新计算$0
为不存在的字段赋值,将新增字段并按需使用空字符串填充中间的字段,并使用OFS重新计算$0
awk 'BEGIN{OFS="-"}{$(NF+2)=5;print $0}' a.txt
增加NF值,将使用空字符串新增字段,并使用OFS重新计算$0
awk 'BEGIN{OFS="-"}{NF+=3;print $0}' a.txt
减小NF值,将丢弃一定数量的尾部字段,并使用OFS重新计算$0
awk 'BEGIN{OFS="-"}{NF-=3;print $0}' a.txt
关于$0
当读取一条record之后,将原原本本地被保存到$0当中。
awk '{print $0}' a.txt
换句话说,没有导致$0重建,$0就一直是原原本本的数据,所以指定OFS也无效。
awk 'BEGIN{OFS="-"}{print $0}' a.txt # OFS此处无效
当$0重建后,将自动使用OFS重建,所以即使没有指定OFS,它也会采用默认值(空格)进行重建。
awk '{$1=$1;print $0}' a.txt # 输出时将以空格分隔各字段
awk '{print $0;$1=$1;print $0}' OFS="-" a.txt
如果重建$0之后,再去修改OFS,将对当前行无效,但对之后的行有效。所以如果也要对当前行生效,需要再次重建。
# OFS对第一行无效
awk '{$4+=10;OFS="-";print $0}' a.txt
# 对所有行有效
awk '{$4+=10;OFS="-";$1=$1;print $0}' a.txt
关注$0重建是一个非常有用的技巧。
例如,下面通过重建$0的技巧来实现去除行首行尾空格并压缩中间空格:
$ echo " a b c d " | awk '{$1=$1;print}'
a b c d
$ echo " a b c d " | awk '{$1=$1;print}' OFS="-"
a-b-c-d
文章链接: https://www.junmajinlong.com/shell/awk/field_modify/
|