![查找文件中的最大值](https://linux22.com/image/36833/%E6%9F%A5%E6%89%BE%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E6%9C%80%E5%A4%A7%E5%80%BC.png)
我有一个包含多个数字的文件,如下所示。
21 12 33 35 21 12 33 44 52 63 14 12 23 34 11 12 13 53 1 12 43 33 44
我怎样才能找到这些值的最大值,即63
?我想使用,stats
但我的机器上似乎不存在这个命令,我不想安装它。我该如何使用perl
?
答案1
其他答案非常好,Perl / awk 是最佳选择。
只是为了好玩,你也可以使用这个(假设是 GNU grep
):
$ grep -Eo '[0-9]+' file | sort -rn | head -n 1
63
解释
grep -Eo '[0-9]+' file
打印文件中正十进制整数的所有匹配项。根据-o
标志,每场比赛都会打印在不同的行中。sort -rn
按数字顺序对列表进行反向排序,使第一个数字最大。head -n 1
打印第一行。
按步骤:
$ grep -Eo '[0-9]+' file
21
12
33
35
21
12
33
44
52
63
14
12
23
34
11
12
13
53
1
12
43
33
44
$ grep -Eo '[0-9]+' file | sort -rn
63
53
52
44
44
43
35
34
33
33
33
23
21
21
14
13
12
12
12
12
12
11
1
答案2
我知道这不是 perl:
awk '{for(i=1;i<=NF;i++) if($i>maxval) maxval=$i;}; END { print maxval;}' file
答案3
使用List::Util
(自 5.8 起成为标准库的一部分,否则可在 CPAN 上使用):
perl -MList::Util=max -lane 'print max(@F)'
答案4
这是一种更快的 Perl 方法,不需要排序:
$ echo '21 12 33 35 21 12 33 44 52 63 14 12 23 34 11 12 13 53 1 12 43 33 44' |
perl -lane 'map{$m=$_ if $_>$m}@F; print $m'
或者,正如 @Gnouc 在评论中建议的那样:
$ echo '21 12 33 35 21 12 33 44 52 63 14 12 23 34 11 12 13 53 1 12 43 33 44' |
perl -lane '$m<$_ and $m=$_ for @F; print $m'