Bashで配列をソートできる関数を作成するには?

Bashで配列をソートできる関数を作成するには?

配列をパラメータとして受け取り、ソートできる関数を作成する方法を見つけようとしています。位置変数で行われているようですが、わかりません。

ベストアンサー1

強く打つ

bashまだ組み込みのサポートがないようです。オプションは、ソートアルゴリズムを手動で実装するか、sortソートアルゴリズムを呼び出すことです。

配列要素にゼロ以外のすべてのバイト値を含めることができると思われる場合、bashこれを確実に実行するには、NULで区切られた要素のリストを渡し、オプション-zsort非標準ですがGNUソートまたはFreeBSDソートで使用可能)を使用する必要があります。

bash-4.4(2016年9月リリース)では、区切り文字を指定する-dオプションを組み込みに導入して、作業をより簡単にします。readarray

配列aを配列で並べ替えますb

readarray -td '' b < <(printf '%s\0' "${a[@]}" | sort -z)

配列は安定して整列されます。数値順または逆順(またはサポートされている並べ替え条件)で並べ替えるには-n、オプションを使用します。-rsortsort

関数を実装するにはsortarray(引数として渡されたすべての配列を名前でソート):

sortarray() for array do
  eval '((${#'"$array"'[@]} <= 1))' || readarray -td '' "$array" < <(
    eval "printf '%s\0' \"\${$array[@]}\" | sort -z")
done

以前のバージョンでは、ループ内で同じことを実行bashできます。read -d

b=()
while IFS= read -rd '' item; do b+=("$item"); done < <(
  printf '%s\0' "${a[@]}" | sort -z)

機能の場合sortarray

sortarray() for array do eval '
  tmp=()
  while IFS= read -rd "" item; do tmp+=("$item"); done < <(
    printf "%s\0" "${'"$array"'[@]}" | sort -z)
  '"$array"'=("${tmp[@]}")'
done

扱いにくい

Zshには配列整列機能が組み込まれています。

oパラメータ拡張フラグを使用して、語彙的に(O逆順に)ソートできます。n数値順に並べ替えるためにフラグを追加できます。

$ a=('' 12 2 d é f $'a\nb')
$ printf '<%s>\n' "${(@o)a}"
<>
<12>
<2>
<a
b>
<d>
<é>
<f>
$ printf '<%s>\n' "${(@no)a}"
<>
<2>
<12>
<a
b>
<d>
<é>
<f>

まだ大文字と小文字を区別するソート機能がないロケールでは、これにiフラグを追加することもできます。

配列に割り当てる:

b=("${(@o)a}")

したがって、sortarray関数は次のようになります。

sortarray() for array do eval "$array=(\"\${(@o)$array}\")"; done

AT&T ksh

set -s -- "${a[@]}"
b=("$@")

set -sパラメータリストを並べ替えて、位置パラメータに保存します。順序は語彙的です。

機能はsortarray次のとおりです。

sortarray() for array do
  eval 'set -s -- "${'"$array"'[@]}"; '"$array"'=("$@")'
done

おすすめ記事