Linux:为什么awk指令中,对NF++后输出结果有影响呢
local]# echo
"111|222|333"|awk 'BEGIN{FS=""}{NF++;print $0}'
1 1 1 | 2
2 2 | 3 3 3
[root@localhost
local]# echo
"111|222|333"|awk 'BEGIN{FS=""}{print $0}'
111|222|333
求大神指导 展开
不明白的时候,首先是尝试:
echo "111|222|333"|awk 'BEGIN{FS=""}{NF++;print $1}'
echo "111|222|333"|awk 'BEGIN{FS=""}{NF++;print $2}'
echo "111|222|333"|awk 'BEGIN{FS=""}{NF++;print $3}'
echo "111|222|333"|awk 'BEGIN{FS=""}{NF++;print $4}'
echo "111|222|333"|awk 'BEGIN{FS=""}{NF++;print $5}'
发现输出都没有变化,不受NF++的影响。
因此怀疑只有$0有玄机。
其次就是查阅man awk,搜索\$0寻求答案。于是发现下面这段话(原汁原味的):
“References to non-existent fields (i.e. fields after $NF) produce the null-string. However, assigning to a non-existent field (e.g., $(NF+2) = 5) increases the value of NF, creates any intervening fields with the null string as their value, and causes the value of $0 to be recomputed, with the fields being separated by the value of OFS. References to negative numbered fields cause a fatal error. Decrementing NF causes the values of fields past the new value to be lost, and the value of $0 to be recomputed, with the fields being separated by the value of OFS.”
我可以针对主要内容大致翻译一下:
任何对内置变量NF的改变都会导致$0被重新计算,重构$0时以OFS的值(默认为空格)作为字段分隔。增加NF值,不存在的字段将以空字符串填充;减少NF值,会导致超出其长度的字段丢失。
为了验证,可以试试下面两个例子。
【例一】
$ echo "111|222|333"|awk 'BEGIN{FS=""}{NF+=5;print $0"--"}'
1 1 1 | 2 2 2 | 3 3 3 --
字段以OFS(空格)分隔,并且新增的5个字段都以空字符串填充。
【例二】
$ echo "111|222|333"|awk 'BEGIN{FS=""}{NF-=2;print $0"--"}'
1 1 1 | 2 2 2 | 3--
字段以OFS(空格)分隔,$0中超出新NF大小的字段丢失。