経緯
シェルスクリプトで、抽出した順番を保持したまま配列の重複除去を行いたかったのでメモ。
コード
# 配列に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}'
を採用することにしました。