[bash] 配列をset(集合)として扱いたい

2018年8月6日月曜日

bash シェルスクリプト

[bash] 配列をソート、検索でbashの配列操作について書いたけど、配列をset(集合)として取り扱いたい場合の操作について。
※bash4以降では連想配列が使えるので、bash4前提であれば、そっちを使ったほうがいいかも。

配列をユニークにする

まずは配列から重複している要素を削除して、ユニークにする。
要素の順序は気にしない。
arr=( 1 2 3 4 5 2 4 6 )
uniq_set=$( printf "%s\n" "${arr[@]}" | sort -u )
echo ${uniq_set[@]}
# 1 2 3 4 5 6

集合のマージ

重複している要素を考慮して、2つの集合をマージする。
set1=( 1 2 3 4 5 )
set2=( 1 3 5 7 9 )

set3=( $( {
  printf "%s\n" "${set1[@]}"
  printf "%s\n" "${set2[@]}"
} | sort -u ) )
echo ${set3[@]}
# 1 2 3 4 5 7 9

集合からの削除

集合1から集合2の要素を全て削除する。
arr=( 1 2 3 4 5 )
del=( 2 4 )
del_str=$( printf "%s\n" "${del[@]}" )
arr=( $( printf "%s\n" ${arr[@]} | grep -v -F -e "$del_str" ) )
echo ${arr[@]}
# 1 3 5