質問: 例えば「あ[1]、い[2]、う[3]、え[4]、お[5]」といったデーターの配列があるとします。 そこで、例えば「う」を指定したのならば「う」から開始してどんどん右へソートしていき、一番右に来たら最初から折り返し、あから再度ソートします。 つまり、 入力データーが「あ、い、う、え、お」 並び替えを開始するデーターを「う」 とすると 「う、え、お、あ、い」 と返すようにしたいです。 また、スクリプトは極端に実行速度が遅くならない限り、できるだけ簡潔なものが好ましいです。 追記です。 並び替えを開始するデーターを指定するのは配列番号でも構いません。 文字列ではなく配列番号で指定したほうが実行速度が早くなるか簡潔になるのであればそちらのほうが好ましいです。(つまり「う」というデーターではなく3を指定)
回答: 「あ、い、う、え、お」では辞書順になっていて分かりづらいかと思いましたので、入力を `z b x h j g` に変更しています。なお、エラーチェックはしていませんので、`start` 変数に 0 以下の値を入れるとエラーになります。 ``` #!/bin/bash ##declare -a arr=(あ い う え お) declare -a arr=(z b x h j g) declare -i start=3 : $((start--)) declare -a first=("${arr[@]:$start:${#arr[@]}}") declare -a last=("${arr[@]:0:$start}") IFS=$'\n' declare -a sorted=($(sort <<<"${first[*]}") $(sort <<<"${last[*]}")) echo "${sorted[@]}" ``` **実行結果** ``` g h j x b z ``` 余談になりますが、GNU awk version 4.0 以降であれば、以下の様にもできます。ただし、入力と出力は文字列になりますが。 ``` $ gawk -V GNU Awk 4.1.4, API: 1.1 (GNU MPFR 4.0.1, GNU MP 6.1.2) Copyright (C) 1989, 1991-2016 Free Software Foundation. $ echo 'z,b,x,h,j,g' | gawk -ijoin -vRS=',' -vSTART=3 ' NR=START{d2[j++]=$1} END{ asort(d1);asort(d2) printf("%s%s%s\n", join(d2,1,NR-START+1,RS), (START>1?RS:""), join(d1,1,START-1,RS)) }' => g,h,j,x,b,z ```