使用AWK查找最大值

时间:2019-06-10 10:15:55

标签: awk max

我有一个包含两列数据的文件,我想找到最大值并打印出来。 文件= load_measure

11:20,18.03
11:25,17.85
11:30,18.24
11:35,19.19
11:40,18.45
11:45,17.53
11:50,17.56
11:55,17.60
12:00,18.51
12:05,18.50

我尝试通过以下代码,但返回0

awk 'BEGIN {max = 0} {if ($2>max) max=$2} END {print max}' load_measure
0

我尝试通过将max声明为$ max来尝试,但它不计算实际的最大值:

awk 'BEGIN {max = 0} {if ($2>max) max=$2} END {print $max}' load_measure
12:05,18.50

谁能解释我在做什么错? 谢谢!

2 个答案:

答案 0 :(得分:3)

当您的字段被空格以外的其他内容分隔时,您需要通过填充FS来告诉awk这是什么。您还需要将max设置为读取的第一个值,以便该脚本适用于全负输入,并且即使输入文件为空,也需要在END中打印max+0以确保数字输出:

awk -F, 'NR==1{max=$2} $2>max{max=$2} END{print max+0}' file

其中max为2,print max打印出max的值,即2,而print $max打印出以max的值索引的字段的值,即{{ 1}},在END部分中,该值将为null或在读取的最后一行读取$ 2的值(每个POSIX的未定义行为,因此与awk相关)。

答案 1 :(得分:2)

您应该指定FS的值,它是输入字段的分隔符。它描述了每个记录如何拆分为字段;它甚至可能是扩展的正则表达式。

在awk的命令行上,可以将FS指定为-F <sep>(或-v FS=<sep>)。您也可以在BEGIN块中进行设置。

我通常使用后一种方法,但这只是个人喜好:

BEGIN {max=0;FS=","} ....

您的问题也可以这样解决:

awk -F, -v m=0 '$2>m {m=$2} END {print m}' 

因此保留if语句。

POSIX强制的默认值为空格(0x20)。但是请注意,运行空间(不止一个)可能被视为一个字段分隔符。

Here is the official documentation for GNU Awk。