查找文件中的最大值

AFP*_*FPP 11 perl text-processing

我有一个包含多个数字的文件,如下所示。

21 12 33 35 21 12 33 44 52 63 14 12 23 34 11 12 13 53 1 12 43 33 44
Run Code Online (Sandbox Code Playgroud)

我怎样才能找到这些值的最大值,即63?我想使用,stats但我的机器上似乎不存在此命令,我不想安装它。我怎样才能接近使用perl

fed*_*qui 23

其他答案非常好,Perl / awk 是要走的路。

只是为了好玩,你也可以使用这个(假设 GNU grep):

$ grep -Eo '[0-9]+' file | sort -rn | head -n 1
63
Run Code Online (Sandbox Code Playgroud)

解释

  • 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
Run Code Online (Sandbox Code Playgroud)


Hau*_*ing 8

我知道这不是 perl:

awk '{for(i=1;i<=NF;i++) if($i>maxval) maxval=$i;}; END { print maxval;}' file
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案的一个很好的特点是它在 O(n) 时间内运行,而执行排序的解决方案需要 O(n * log(n))。+1 (5认同)
  • @A2009 是的,`awk` 是一个 POSIX 工具(像往常一样:具有标准化的语言主体和不同实现的不兼容扩展)。 (4认同)

Chr*_*own 8

使用List::Util(自 5.8 以来的标准库的一部分,否则在 CPAN 上可用):

perl -MList::Util=max -lane 'print max(@F)'
Run Code Online (Sandbox Code Playgroud)


cuo*_*glm 6

另一种perl解决方案:

$ perl -MList::Util=max -anle 'print max(@F)' file 
63
Run Code Online (Sandbox Code Playgroud)

这将适用于包含一行的文件,如果文件中有多行,并且想要在所有行中找到最大值,请尝试:

$ perl -MList::Util=max -alne '$tmp = max @F; $max = $tmp if $max < $tmp; END { print $max }'
Run Code Online (Sandbox Code Playgroud)