awkArray[NR]=$0和awkArray[NR]=$1如何打印最后一个数字

awkArray[NR]=$0和awkArray[NR]=$1如何打印最后一个数字,awk,Awk,如何打印最后一个数字。 我的理解是num.log中的所有记录都是按排序顺序传递给awkArray,然后不理解$0,$1。在这里工作 $cat num.log | sort-n | awk'{awkArray[NR]=$0}END{print awkArray[NR]}' 77 如果没有排序,它不会打印任何内容。为什么? $cat num.log | awk'{awkArray[NR]=$0}END{print awkArray[NR]}我在查找文件中的最大数量时,是为windows环境编写的(在

如何打印最后一个数字。 我的理解是num.log中的所有记录都是按排序顺序传递给
awkArray
,然后不理解
$0,$1
。在这里工作

$cat num.log | sort-n | awk'{awkArray[NR]=$0}END{print awkArray[NR]}'

77

如果没有排序,它不会打印任何内容。为什么?


$cat num.log | awk'{awkArray[NR]=$0}END{print awkArray[NR]}

我在查找文件中的最大数量时,是为windows环境编写的(在cmd.exe下运行)。在此环境中,只能使用双引号来“保护”awk脚本,即使这样,它也会阻止您在脚本中使用双引号。即使在输入文件中只有负数的情况下,也可以使用以下方法。如果输入文件为空,则返回空行:

$ cat num.log
10
20
1
77
22
05


$ cat num.log | sort -n
1
05
10
20
22
77

特别感谢埃德·莫顿的建设性建议(见下文评论)。在shell环境中运行脚本时,请遵循他的建议使用单引号。

如果只有一个字段,则
$0
$1
相同。如果您试图找到最大的数字,那么awk可以很容易地找到,而不需要
排序
文件末尾是否有空行?排序-N将将空白行移到文件的顶部。您的awk脚本实际上是“tail-1”。虽然我同意@mevets的推理,但这并不是问题中发布的排序输出所显示的。@EdMorton我认为它确实显示了这一点(第二个提示符前有两行空白),但海报裁剪了输出。@williampersell这不仅仅是裁剪的情况,这意味着OP删除了
$cat num.log | sort-n
和输出的第一行
1
之间的空行。当问问题时,这是一件有趣的事情,所以我不确定我是否相信这一点。我唯一的另一个想法是,有些行以CR结尾,而另一些行则不以CR结尾,打印一行会使它看起来像什么都没有打印。将脚本(和字符串)用单引号括起来,而不是双引号括起来,并始终通过初始化为读取的第一个值来启动最小/最大计算,这样即使所有值都为负值,它也能工作,不要为没有输入而打印空行,例如,
awk'NR==1{max=$0}$0>max{max=$0}END{if(max!=“”)print max}'num.log
。感谢您的建议!您的改进将避免在输入文件为空的情况下输出空行。单引号对于您正在演示的情况(例如,在bashshell脚本中以及在awk脚本中使用双引号时)肯定很有帮助。然而,在某些情况下,双引号也会有帮助,因为我自己倾向于在cmd.exe脚本(win 10)中经常使用awk,而单引号不起作用。而且,我也用负数测试了我的脚本:它可以工作。我的测试是用GNU Awk 3.1.6执行的。当输入都是负数时,脚本不可能工作,因为$0在任何时候都不会大于max(零或空未初始化变量)。在windows中使用awk时,避免噩梦般的引用规则的常见建议是将脚本放入文件中,并将其作为
awk-f脚本输入调用。由于在shell中使用双引号将“起作用”,但会产生需要处理的意外后果(例如,脚本中的每个
$0
都是正在运行的shell的名称,而不是输入行的值),而且这里的大多数问题都是关于shell的,因此最好避免使用双引号。@EdMorton,再次感谢,您的回答完全正确,我相应地改变了答案。
awk "NR==1{max=$0} $0>max {max=$0} END {print max}" num.log