列の最大長と最小長の値とデータを取得しますか? [閉鎖]

列の最大長と最小長の値とデータを取得しますか? [閉鎖]

10個のフィールドを含むタブ区切りファイルで、次のようにフィールドの最小長と最大長とデータ値をどのように取得できますか?

Field1 : Min 5 max 10  abcde abcdefghij
Field2: Min 3 max 5    abc   abcde

答え1

次のスクリプトは必要な操作を実行する必要があります。

#!/usr/local/bin/bash

input=./input
row=0
while read -r line; do
    columns=( $line )
    ((row++))
    max=0
    min=${#line}
    vmax=
    vmin=
    for column in "${columns[@]}"; do
        ((${#column}>max)) && max=${#column} && vmax=$column
        ((${#column}<min)) && min=${#column} && vmin=$column
    done
    echo "Row${row}: Min $min max $max $vmin $vmax"
done<"$input"

次の入力が与えられた場合:

field0      field1     field2    field3   field4  field5  field6   field7    field8     field9
a           aa         aaa       aaaa     aaaaa   aaaaaa  aaaaaaa  aaaaaaaa  aaaaaaaaa  aaaaaaaaaa
bbbbbbbbbb  bbbbbbbbb  bbbbbbbb  bbbbbbb  bbbbbb  bbbbb   bbbb     bbb       bb         b

次の出力が生成されます。

$ ./script.sh
Row1: Min 6 max 6 field0 field0
Row2: Min 1 max 10 a aaaaaaaaaa
Row3: Min 1 max 10 b bbbbbbbbbb

注:ラインに同じ長さのフィールドが複数あり、最終的に最小/最大長のラインになると、その長さの最初のフィールドが出力されます。 (例では、入力row1には同じ長さのすべてのフィールドがあるため、field0を最小値と最大値としてリストします。)

関連情報