2017-11-03 9 views
0

このスクリプトは、cvsリストを3つの列に分割します。 "名前"の列に注目しています。私は最も多くの文字を持っている名前を発見したい。ほとんどの文字を持つ名前が見つかると、その文字を変数に代入します。英語で - -Bash - 整数リストからMAX値を取得

#!/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のに設定された長さよりも大きい場合は、何もしません。これでほとんどの文字と エリアの文字列は、スクリプトがすべての文字を通じて読み取ると26を持っている「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 

を返す必要があります$ maxLengthに何かを割り当てるのを止めるべきです。 代わりに、それは、各文字列の長さのリストを返す、と私はあなたのループは(専門用語)ビットグラグラしていて、の繰り返し毎にゼロにmaxLengthをリセットする方法ゼロがここ

[email protected] $ ./length_test.sh 
17 
0 ### how does the zero get in here ? 
15 
13 
15 
18 
26 ###script_name_12345678999999 
16 
19 
14 
21 
+0

ループごとに 'maxLength = 0'? –

+0

ループ内のすべての反復で、maxLengthをゼロにすることは意図していません。私はちょうどそれを初期化していると思った。 – capser

答えて

1

に入っ見当がつかないあなたのループ。

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

ルック物事を超える

#!/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" 

使用例/出力し、さらに質問がある場合は私に知らせて:あなたはもう少しのような何かをしたいです。

1
あなたが言ったので、あなたがawkの

を使用できるかどう

それは簡単:

このスクリプトは、3つの列にCVSのリストを分割します。私たちは "名前"の列に を集中しています。私はここで最も 文字

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 

あなたはちょうどその変数にMAXLENGTHのSCRIPT_NAMEを取得したい場合は、単に変数名を印刷します、内包する$(....)以下のように

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

GNU/Linuxでは、これを行うこともできますワンショット。英語で

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

:ファイルdataはあなたの記録がある場合は、フィールドセパレータとして

  • 印刷最長の行の長さを

    • Pluckの、使用して2列の ""
  • +1

    これは非常に魅力的なプログラミングです – capser

    +1

    うわー、新しいことを学びました: '-L'オプション。 – karakfa

    +1

    これはシェルの優雅さと力を証明していると思います – capser

    関連する問題