我有一个包含两列数据的文件,我想找到最大值并打印出来。 文件= 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
谁能解释我在做什么错? 谢谢!
答案 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。