解释awk命令'awk';{if(NF>;max)max=NF}END{print max}';

解释awk命令'awk';{if(NF>;max)max=NF}END{print max}';,awk,Awk,在一本在线awk手册中,我找到了一个例子 awk'{if(NF>max)max=NF}END{print max}' 该程序打印任何输入行上的最大字段数。 但我不明白awk如何进行比较(NF>max)如果“max”只是未定义的字符串??它可以是0、100或100000?:-) 考虑在第一次运行时,max没有值。因此字段数大于不存在的字段数,并且更新max以反映第一行中的字段数。每个循环都执行相同的检查:“这一行的字段数是否比任意命名的变量多?”因此,当您到达末尾时,您知道max反映了字段的最大数

在一本在线awk手册中,我找到了一个例子
awk'{if(NF>max)max=NF}END{print max}'
该程序打印任何输入行上的最大字段数。
但我不明白awk如何进行比较
(NF>max)
如果
“max”
只是未定义的字符串??它可以是0、100或100000?:-)

考虑在第一次运行时,
max
没有值。因此字段数大于不存在的字段数,并且更新
max
以反映第一行中的字段数。每个循环都执行相同的检查:“这一行的字段数是否比任意命名的变量多?”因此,当您到达末尾时,您知道
max
反映了字段的最大数量

更新:@s.bandara的评论恰到好处,表明我可能应该更清楚地指出
max
的价值@Josh Caswell的回答给出了一些很好的技术细节,因此我将添加一个快速示例来演示他的观点:

echo '' | awk 'END {print (monkey=="")}' // true, an undefined variable is equal to the empty string
echo '' | awk 'END {print (monkey==0)}' // true, the numerical value of an undefined variable is 0
echo '' | awk 'END {print (monkey==biscuits)}' // true, one undefined variable is equal to another
echo '' | awk 'END {print (monkey=="test")}' // false
echo '' | awk 'END {print (monkey==4)}' // false

awk
中的变量。它将在需要时创建。如果未指定特定值,将使用默认的空字符串。在比较上下文中,空字符串被强制为数字零


因此,在您的代码中,
max
是在第一次引用时创建的,如果(NF>max)是在第一次计算时创建的。之后,如果if测试成功,它将存在并分配给。

+1表示OP和@ajk。不明显的是,
3>“
应该为true。变量存在——它实际上是在需要时立即创建的,并且默认情况下使用空字符串初始化,这相当于数字零,因为它用于比较上下文。另外,稍短的
awk'NF>max{max=NF}END{print max}“
也做同样的事情。在这种情况下,可以在模式中使用操作中使用的测试,从而避免了“if”的需要。