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

Posted

技术标签:

【中文标题】Bash - 从整数列表中获取最大值【英文标题】:Bash - getting MAX value from a list of integers 【发布时间】:2018-04-15 16:14:53 【问题描述】:

此脚本将 cvs 列表分成三列。 我们专注于“名称”列。我想找出字符最多的名字。一旦找到字符最多的名称,我想将其分配给一个变量。

#!/bin/bash
for i in $(cat homeaway.txt )
do
echo $i | while IFS=, read -r area name host
do
        maxLength=0
        length=$#name
        if [ $length -gt $maxLength ] ; then
            maxLength=$length
        else
           :
        fi
        printf "%s\n" $maxLength

      done
done

脚本说 - 英文 - 如果长度大于 maxlength,则将长度设置为 maxLength,如果不是,则不执行任何操作。 其中字符最多的区域字符串是“script_name_12345678999999”,共有 26 个字符。当脚本读取所有字符时,$maxLength 应该返回 26。

__DATA__
HOME,script_name_12345,USAhost.com   
AWAY,script_name_123,USAhost.com
HOME,script_name_1,EUROhost.com
AWAY,script_name_123,USAhost.com
HOME,script_name_123456,EUROhost.com
AWAY,script_name_12345678999999,USAhost.com
HOME,script_name_1234,USAhost.com
AWAY,script_name_1234578,USAhost.com
HOME,script_name_12,EUROhost.com
AWAY,script_name_123456789,USAhost.com

一旦脚本达到包含 26 个字符的区域值,它应该停止将任何内容分配给 $maxLength。 相反,它返回每个字符串长度的列表,我不知道零是如何进入这里的

casper@casper01.com $ ./length_test.sh
17
0   ### how does the zero get in here ?
15
13
15
18
26  ###script_name_12345678999999
16
19
14
21

【问题讨论】:

maxLength=0 每个循环? 循环中的每次迭代都不打算让 maxLength 归零。我以为我只是在初始化它。 【参考方案1】:

my_command | sort -n | tail -1

对命令的输出进行数字和升序排序。获取结果列表中的最后一个元素。

【讨论】:

【参考方案2】:

在 GNU/Linux 上,您也可以一次性完成。如果文件data有你的记录:

cut -d, -f2 < data | wc -L

英文:

提取第二列,使用“,”作为字段分隔符 打印最长行的长度

【讨论】:

这是一段非常引人注目的编程 我认为这展示了 shell 的优雅和强大 我以为我们想从整数列表中找到最大值?如果所有值的位数相同,这不起作用,对吧? 另外,我认为wc -L 会打印最大行长。所以它只会给你最大数字的位数(即如果 400 是你的最大数字,wc -L 给你 3) 啊,好吧。我专注于“我想要整数列表中的最大整数”【参考方案3】:

您的循环有点不稳定(技术术语),您在循环的每次迭代中将maxLength 重置为零。你想要的东西更像:

#!/bin/bash

fn="$1:-/dev/stdin"   ## read from file given as 1st argument (default stdin)

test -r "$fn" ||       ## validate file is readable 
    printf "error: file not readable '%s'.\n" "$fn"
    exit 1


declare -i maxlength=0  ## set maxlength before loop
maxname=

while IFS=, read -r area name host
do
    test -n "$name" || continue            ## if name not set get next line
    len=$#name
    if [ "$len" -gt "$maxlength" ]; then   ## test length against max
        maxlength=$len                     ## update max if greater
        maxname="$name"                    ## save name in maxname
    fi
done <"$fn"                                ## feed loop by redirecting file

printf "maxname: %s  (len: %d)\n" "$maxname" "$maxlength"

使用/输出示例

$ bash maxnm.sh <dat/maxnm.txt
maxname: script_name_12345678999999  (len: 26)

查看一下,如果您还有其他问题,请告诉我。

【讨论】:

【参考方案4】:

如果你会使用 awk 就很容易

既然你说:

此脚本将 cvs 列表分成三列。我们专注 在“名称”列上。我想发现拥有最多的名字 字符

awk -F, 'l=length($2)l>maxmax=l; name=$2ENDprint name, max' infile

这是测试结果:

$ cat infile
HOME,script_name_12345,USAhost.com   
AWAY,script_name_123,USAhost.com
HOME,script_name_1,EUROhost.com
AWAY,script_name_123,USAhost.com
HOME,script_name_123456,EUROhost.com
AWAY,script_name_12345678999999,USAhost.com
HOME,script_name_1234,USAhost.com
AWAY,script_name_1234578,USAhost.com
HOME,script_name_12,EUROhost.com
AWAY,script_name_123456789,USAhost.com

$ awk -F, 'l=length($2)l>maxmax=l; name=$2ENDprint name, max' infile
script_name_12345678999999 26

如果您只想将最大长度的 script_name 获取到变量,则只需打印变量名,然后将其包含在 $(....) 中,如下所示

$ myvar=$( awk -F, 'l=length($2)l>maxmax=l; name=$2ENDprint name' infile )
$ echo "$myvar"
$ script_name_12345678999999

【讨论】:

以上是关于Bash - 从整数列表中获取最大值的主要内容,如果未能解决你的问题,请参考以下文章

从带有列表的列表中获取最大值?

python 从对象列表中获取最大属性值

如何从Dart中的列表中找到最小值和最大值?

从 int 列表中获取最大最接近的数字

linux命令练习:基本bash脚本练习 取三个数最大值及最小值

dart - 如何从Dart中的列表中找到最小值和最大值