使用AWK查找最大值

使用AWK查找最大值,awk,max,Awk,Max,我有一个包含两列数据的文件,我想找到最大值并打印它。 文件=加载\测量 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

我有一个包含两列数据的文件,我想找到最大值并打印它。 文件=加载\测量

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,但它不计算真正的max:

awk 'BEGIN {max = 0} {if ($2>max) max=$2} END {print $max}' load_measure
12:05,18.50
谁能解释我做错了什么?
谢谢大家!

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

在awk的命令行上,
FS
可以指定为
-F
(或
-vfs=
)。您还可以在
开始
块中设置它

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

BEGIN {max=0;FS=","} ....
您的问题也可以这样解决:

awk -F, -v m=0 '$2>m {m=$2} END {print m}' 
这样就省去了一个
if
语句

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


对于GNU Awk。

当字段被其他空格分隔时,您需要通过填充FS来告诉Awk这是什么。您还需要将max设置为读取的第一个值,这样脚本将适用于所有负数输入,并且您需要在最后打印
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的值索引的字段的值,即
$2
,该值在结尾部分将为null或在最后一行读取时为$2(根据POSIX的未定义行为,因此取决于awk)。但请注意…可能被视为一个字段分隔符。-不完全是。当
FS
的默认值为
”时,分隔符awk使用给定值为(而不是“可能是”)所有连续空格链,并在字段分配期间忽略记录中的前导/尾随空格。要真正获得文本空间字符的分隔符,需要设置
FS=“[]”
。如果所有的$2都是负数(将m设置为第一个值),那么脚本将失败,如果您最后打印了m+0,那么您就不需要
-vm=0
。这是
m+0
的一个聪明技巧,我应该想到。谢谢你再次教我@EdMorton!