首页 > 解决方案 > 如何在bash中删除现有数组中的重复元素?

问题描述

如何创建一个只包含 Array 中唯一元素的 newArray?

例如:ARRAY 分别包含aa ab bb aa ab ccARRAY[0-5] 处的元素。

当我打印 newARRAY 时,我只想aa ab bb cc分别在 newARRAY[0-3] 处。

我已经搜索了一段时间的堆栈溢出,但没有解决我的问题。我试图这样做newARRAY=$(ARRAY[@] | sort -u | uniq,但重复的元素仍然存在。

标签: bashunix

解决方案


天真的方法

要获取的唯一元素arr并假设没有元素包含换行符:

$ printf "%s\n" "${arr[@]}" | sort -u
aa
ab
bb
cc

更好的方法

要获得一个 NUL 分隔的列表,即使有换行符也能工作:

$ printf "%s\0" "${arr[@]}" | sort -uz
aaabbbcc

(当然,这在终端上看起来很难看,因为它不显示 NUL。)

把它们放在一起

要捕获结果newArr

$ newArr=(); while IFS= read -r -d '' x; do newArr+=("$x"); done < <(printf "%s\0" "${arr[@]}" | sort -uz)

运行上述后,我们可以使用declare来验证这newArr是我们想要的数组:

$ declare -p newArr
declare -a newArr=([0]="aa" [1]="ab" [2]="bb" [3]="cc")

对于那些喜欢他们的代码分布在多行的人,上面可以重写为:

newArr=()
while IFS= read -r -d '' x
do
    newArr+=("$x")
done < <(printf "%s\0" "${arr[@]}" | sort -uz)

附加评论

不要对变量名使用全部大写。系统和外壳程序的名称全部使用大写字母,您不想意外覆盖其中一个。


推荐阅读