Awk求最大值正解

这是一个很简单的功能,今天有同事问AWK如何实现,为什么最后结果是按字符串排序获取到的最大值,同事还在网上搜了下,给出的答案是清一色的,这些人压根不负责,难道你都没自己执行下命令看看返回的结果是否正确吗?只知道复制粘贴

例如下面一段文本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
858
569
1858
1526
256
382
112
1145
921
556
228
215
1356
158

大部分的网上文章都给出了清一色的答案,如下:

1
cat data|awk 'BEGIN {max = 0} {if ($1>max) max=$1} END {print "Max=", max}'

负责任的说,获取到的最大值一定是921,而不是1858,因为第一位是9最大,按字符串比较的,而且为啥还要cat后在管道给awk。。。。

为了正确获取到最大值,需要让awk按数字去比较,因此在比较时需要先将变量强制转换为整数型,这样获取到的最大值就是正确的

1
awk 'BEGIN {max = 0} {if ($1+0 > max+0) max=$1} END {print "Max=", max}' data

这里可以看到比较时对两个变量先加0,就是做数据类型的转换

真心鄙视国内的文章不验证,直观复制粘贴转载,好无节操

更新:
如果想输出排序最大值所在行内容,也可以用awk实现
示例文本如下,以第一列排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
858 haha
569 xixi
1858 hehe
1526 hello
256 world
382 print
112 top
1145 css
921 html
556 perl
228 python
215 shell
1356 awk
158 linux

一个比较简单的方法就是在记录最大值的时候,同时记录一下当前行,后面输出这个变量即可

1
awk 'BEGIN {max = 0} {if ($1+0 > max+0) {max=$1 ;content=$0} } END {print content}' data

这样最后输出的值应该是1858 hehe

声明: 除非注明,小峰网络遨游记文章均为原创,转载请以链接形式标明本文地址

本博客原创文字只代表本人某一时间内的观点或结论,与本人所在公司没有任何关系。

本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。

第三方若用于商业用途的转载,须取得本人授权。

本文作者:

本文地址:http://xfeng.me/awk-get-max/

你可能还对下面文章感兴趣: