シェルスクリプトで抽出した順番を保持して配列の重複除去を行う

経緯

シェルスクリプトで、抽出した順番を保持したまま配列の重複除去を行いたかったのでメモ。

コード

# 配列にIDを格納する
ID_ARR=(${ID//: / })

# 重複要素を除去
ID_ARR2=()
i=0
while read -r x; do
  ID_ARR2[i++]="$x"
done < <(printf '%s\n' "${ID_ARR[@]}" | awk '!a[$0]++{print}')

今回は時系列に沿ってあるIDが抽出されたものが ID_ARR に格納される、という想定です。

その ID_ARR でもう一度時系列に沿って抽出しなおしたかったので、順番を保持したかったのです。

したがって、

# 配列にIDを格納する
ID_ARR=(${ID//: / })

# 重複要素を除去
ID_ARR2=()
i=0
while read -r x; do
  ID_ARR2[i++]="$x"
done < <(printf '%s\n' "${ID_ARR[@]}" | sort -u)

という sort -u をパイプで繋いだ方法は没。検索した結果、 awk '!a[$0]++{print}' を採用することにしました。

参考

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。