awk 内置变量 NF

Dip*_*Dip 0 unix awk

我是 AWK 的初学者。我刚刚学习了内置变量和 for 循环。从教程中我开始知道 NF 表示记录中的字段数..我用它来计算数据库每条记录中的字段数,如下所示。

数据库名称:学生

Annie      101   56   89
Joy        102   78   56
rinken     103   45
Run Code Online (Sandbox Code Playgroud)

并对其执行以下代码

awk '{print NR,"->",NF}' student
Run Code Online (Sandbox Code Playgroud)

所以它给出如下输出..

1 -> 4
2 -> 4
3 -> 3
Run Code Online (Sandbox Code Playgroud)

所以很明显它适用于现场..但在下面的数据库中它的工作方式不同数据库名称:练习

1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

我对其执行了以下命令来总结所有数据

awk '{for(i=1;i<=NF;i++) total=total+$i}; END {print total} ' practice
Run Code Online (Sandbox Code Playgroud)

输出 :

15
Run Code Online (Sandbox Code Playgroud)

那么NF在第二个例子中是如何工作的。所以我的问题是它如何计算输出,因为只有一个字段。那么循环会工作多少次?

Ini*_*ian 5

awk在每一行上顺序运行,因此对于它解析的每一行,它都会循环到每一行中的总列数1

所以理想情况下它解析为,

awk '{for(i=1;i<=NF;i++) total=total+$i}; END {print total} ' practice
#  value of  i=1,NF=1    total=0+1  (1)         NR=1
#  value of  i=1,NF=1    total=1+2  (3)         NR=2
#  value of  i=1,NF=1    total=3+3  (6)         NR=3
#  value of  i=1,NF=1    total=6+4  (10)        NR=4
#  value of  i=1,NF=1    total=10+5 (15)        NR=5
Run Code Online (Sandbox Code Playgroud)

并将所有列1条目汇总在一起,您可以这样做

 awk '{ sum += $1 } END { print sum }'
Run Code Online (Sandbox Code Playgroud)