Bash - 从整数列表中获取MAX值

时间:2017-11-03 01:36:54

标签: bash list while-loop max

此脚本将cvs列表分为三列。 我们专注于" name"柱。我想发现具有最多字符的名称。一旦找到具有最多字符的名称,我想将其分配给变量。

#!/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"当脚本读完所有字符时,$ 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

4 个答案:

答案 0 :(得分:2)

在GNU / Linux上,您也可以一次性完成此操作。如果文件data包含您的记录:

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

英文:

  • 使用&#34;&#34;拨打第二列。作为字段分隔符
  • 打印最长行的长度

答案 1 :(得分:2)

my_command | sort -n | tail -1

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

答案 2 :(得分:1)

您的循环有点不稳定(技术术语),并且您在循环的每次迭代中将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)

仔细看看,如果您有其他问题,请告诉我。

答案 3 :(得分:1)

如果你可以使用awk那么容易

因为你说:

  

此脚本将cvs列表分为三列。我们正在关注   关于&#34;名称&#34;柱。我想发现最多的名字   字符

awk -F, '{l=length($2)}l>max{max=l; name=$2}END{print 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>max{max=l; name=$2}END{print name, max}' infile
script_name_12345678999999 26

如果您只想将max_name的script_name变为变量,那么只需打印变量名称,然后将其包含在$(....)内,如下所示

$ myvar=$( awk -F, '{l=length($2)}l>max{max=l; name=$2}END{print name}' infile )
$ echo "$myvar"
$ script_name_12345678999999