1. ホーム
  2. linux

[解決済み] Bashで配列から一意な値を取得するにはどうすればよいですか?

2022-10-05 03:51:10

質問

とほぼ同じ質問をしています。 ここで .

配列の中に aa ab aa ac aa ad などがあります。 この配列からユニークな要素をすべて選択したい。 これは、単純に sort | uniq または sort -u を使っても、配列は何も変わりません...。 コードとしては

echo `echo "${ids[@]}" | sort | uniq`

私は何を間違えているのでしょうか?

どうすればいいのでしょうか?

少し面倒ですが、これで大丈夫でしょう。

echo "${ids[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' '

ソートされた一意の結果を配列に戻して保存するには、次のようにします。 配列の割り当て :

sorted_unique_ids=($(echo "${ids[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' '))

シェルが ここに ( bash が必要です)、余裕を持って echo に変更することで、処理を省略することができます。

tr ' ' '\n' <<< "${ids[@]}" | sort -u | tr '\n' ' '

2021年8月28日時点のメモです。

によると シェルチェックwiki 2207 a read -a のパイプを使用すると、分割を避けることができます。 したがって、bashでは、コマンドは次のようになります。

IFS=" " read -r -a ids <<< "$(echo "${ids[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' ')"

または

IFS=" " read -r -a ids <<< "$(tr ' ' '\n' <<< "${ids[@]}" | sort -u | tr '\n' ' ')"

入力です。

ids=(aa ab aa ac aa ad)

出力します。

aa ab ac ad

説明

  • "${ids[@]}" - シェル配列の操作のための構文。 echo の一部として使われるか、あるいはここの文字列として使われるかに関わらず。この配列は @ の部分は、"配列のすべての要素"を意味します。
  • tr ' ' '\n' - すべてのスペースを改行に変換します。配列はシェルからスペースで区切られた1行の要素として見られるため、また、sortは入力が別々の行であることを期待するためです。
  • sort -u - ソートし、ユニークな要素のみを保持する
  • tr '\n' ' ' - は、先ほど追加した改行をスペースに戻すように変換します。
  • $(...) - コマンドの代用
  • 脇です。 tr ' ' '\n' <<< "${ids[@]}" はより効率的な方法です。 echo "${ids[@]}" | tr ' ' '\n'