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

cap*_*ser 1 bash list max while-loop

该脚本将 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
Run Code Online (Sandbox Code Playgroud)

脚本说 - 英文 - 如果长度大于 maxlength,则将 length 设置为 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
Run Code Online (Sandbox Code Playgroud)

一旦脚本达到包含 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
Run Code Online (Sandbox Code Playgroud)

bis*_*hop 7

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

cut --delimiter=, --fields=2 < data | wc --max-line-length
Run Code Online (Sandbox Code Playgroud)

用英语讲:

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

  • 这是一个非常引人注目的编程片段 (2认同)

Use*_*645 7

my_command | sort -n | tail -1

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


Dav*_*ica 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"
Run Code Online (Sandbox Code Playgroud)

使用/输出示例

$ bash maxnm.sh <dat/maxnm.txt
maxname: script_name_12345678999999  (len: 26)
Run Code Online (Sandbox Code Playgroud)

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