Linux:为什么awk指令中,对NF++后输出结果有影响呢

[root@localhostlocal]#echo"111|222|333"|awk'BEGIN{FS=""}{NF++;print$0}'111|222|333[ro... [root@localhost
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

求大神指导
展开
 我来答
百度网友5311d79
2014-04-09 · TA获得超过1.9万个赞
知道大有可为答主
回答量:6356
采纳率:71%
帮助的人:3244万
展开全部

不明白的时候,首先是尝试:

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大小的字段丢失。

acrofox
2014-04-09 · TA获得超过577个赞
知道小有建树答主
回答量:346
采纳率:0%
帮助的人:301万
展开全部
因为NF++ 相当于增加一个字段,而只要对任何一个字段赋值就会重构 $0,重构的方法就是用 $OFS 连接各个字段。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式