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を最小値と最大値としてリストします。)