vak*_*vak 10
some_dups=(aa aa b b c)
uniques=($(for v in "${some_dups[@]}"; do echo "$v";done| sort| uniq| xargs))
echo "${uniques[@]}"
Run Code Online (Sandbox Code Playgroud)
给
aa b c
Run Code Online (Sandbox Code Playgroud)
同样在bash 3中,没有关联数组可用
经过一番谷歌搜索后,我在http://www.catonmat.net/blog/set-operations-in-unix-shell-simplified/找到了一个不错的 bash 实现。它以多种方式拥有所有常用的集合运算符,甚至是可打印的 pdf 备忘单。
虽然我使用了关联数组,但它更具可读性。
声明一个setA关联数组变量:
$ declare -A setA
Run Code Online (Sandbox Code Playgroud)
或者同时声明并添加初始成员:
$ declare -A setA=([memberA]=1 [memberB]=1)
Run Code Online (Sandbox Code Playgroud)
向集合中添加成员:
$ setA[memberC]=1
Run Code Online (Sandbox Code Playgroud)
会员测试:
$ [ -n "${setA[memberC]}" ] && echo in set || echo not in set
in set
$ [ -n "${setA[memberD]}" ] && echo in set || echo not in set
not in set
Run Code Online (Sandbox Code Playgroud)
列表成员(空格分隔):
$ echo "${!setA[@]}"
memberA memberC memberB
Run Code Online (Sandbox Code Playgroud)
或(换行符分隔):
$ printf '%s\n' "${!setA[@]}"
memberB
memberC
memberA
Run Code Online (Sandbox Code Playgroud)
遍历成员:
$ for m in "${!setA[@]}"; do echo "$m"; done
memberB
memberC
memberA
Run Code Online (Sandbox Code Playgroud)
基数(集合中的成员数):
$ echo ${#setA[@]}
3
Run Code Online (Sandbox Code Playgroud)
删除成员:
$ unset setA[memberC]
Run Code Online (Sandbox Code Playgroud)
使用引号添加名称中带有空格的成员:
$ setA["member with space"]=1
Run Code Online (Sandbox Code Playgroud)
也可以使用变量作为成员:
$ read -r str
$ setA["$str"]=1
Run Code Online (Sandbox Code Playgroud)