通过bash从文件中找到最大的数字[重复]

Posted

技术标签:

【中文标题】通过bash从文件中找到最大的数字[重复]【英文标题】:Find the biggest number from a file by bash [duplicate] 【发布时间】:2018-04-06 01:22:21 【问题描述】:

我想从文件中找出最大的值,文件如下:

1
2
3
1
2
3
4
5
1
2
3

我的代码如下(max.sh):

#!/usr/bin/bash

max=1
cat ./num | while read line; do
    if [ $line -gt $max ]; then
        max=$line
    fi
done
echo $max

但是当我bash -x max.sh时,输出是:

+ max=1
+ cat ./num
+ read line
+ '[' 1 -gt 1 ']'
+ read line
+ '[' 2 -gt 1 ']'
+ max=2
+ read line
+ '[' 3 -gt 2 ']'
+ max=3
+ read line
+ '[' 1 -gt 3 ']'
+ read line
+ '[' 2 -gt 3 ']'
+ read line
+ '[' 3 -gt 3 ']'
+ read line
+ '[' 4 -gt 3 ']'
+ max=4
+ read line
+ '[' 5 -gt 4 ']'
+ max=5
+ read line
+ '[' 1 -gt 5 ']'
+ read line
+ '[' 2 -gt 5 ']'
+ read line
+ '[' 3 -gt 5 ']'
+ read line
+ echo 1
1

看起来max得到了最大的值,但是为什么max的最后一个回显是1呢?

【问题讨论】:

顺便说一句,这里有awk one-liners 用于类似的任务。 sort -nr num | head -n1 另外,BashFAQ/024 sort -nr num | head -n1 看起来更容易理解,被采纳了。 【参考方案1】:

你得到了1 的值,因为你使用了一个不必要的管道,这使得while 循环在子shell 中执行,因此max 的值在子shell 本身中丢失并且你得到@ 的预设值987654325@ 在循环后的父 shell 中。

最好使用awk

awk 'min == "" || $1<minmin=$1 $1>maxmax=$1 ENDprint min, max' file

5

【讨论】:

你能稍微解释一下吗? 这很简单awk。对于每条记录,它将变量max$1 进行比较,当我们发现$1 大于max 时,我们再次将max 重置为$1 我建议阅读awk guide 或一个好的教程。 如果我想找出最小的num,awk是什么样的? 查看我的更新答案以查找最小值和最大值

以上是关于通过bash从文件中找到最大的数字[重复]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在号码为 001 时看到错误?请查看下面的代码以从给定数字中找到最大回文数[重复]

程序正在从文件中读取最大的数字,但不是最小的

问题:从data.bat文件中排序,找到数量最大的10个数字,以println的方式分别输出。

如何在文件处理中从文本文件中找到每一行的最小值和最大值?

如何找到最大值和最小值[重复]

Bash - 从整数列表中获取最大值