bash - 如何在bash中删除现有数组中的重复元素?
问题描述
如何创建一个只包含 Array 中唯一元素的 newArray?
例如:ARRAY 分别包含aa ab bb aa ab cc
ARRAY[0-5] 处的元素。
当我打印 newARRAY 时,我只想aa ab bb cc
分别在 newARRAY[0-3] 处。
我已经搜索了一段时间的堆栈溢出,但没有解决我的问题。我试图这样做newARRAY=$(ARRAY[@] | sort -u | uniq
,但重复的元素仍然存在。
解决方案
天真的方法
要获取的唯一元素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)
附加评论
不要对变量名使用全部大写。系统和外壳程序的名称全部使用大写字母,您不想意外覆盖其中一个。
推荐阅读
- c# - 在类中使用 ArrayPool 避免内存泄漏
- office365 - 多家公司如何与 Microsoft Teams 进行有效协作?
- javascript - React 和 Material UI,是否有一种简洁的方法来解构我发送给 useStyles 的道具
- r - 在 R 中循环 2 个变量
- angular - 'X' 类型的参数不能使用 NGRX 分配给'Y' 类型的参数
- c++ - 创建非标准链接列表的问题
- c++ - 从头文件中隐藏指针成员实现
- javascript - 如何从 vanilla javascript 获取 React 按钮的点击事件和类名?
- reactjs - 如何根据 Apollo graphql 服务器上先前 API 请求的结果从前端提交 API 请求?
- r - 如何为常规时间序列转换具有假天数的不规则表?