一尘不染

如何从Bash中的数组获取唯一值?

linux

我和这里的问题差不多。

我有一个包含aa ab aa ac aa ad等的数组。现在,我想从该数组中选择所有唯一元素。思想,这将是简单的用sort | uniqsort -u因为他们在其他问题中提到,但没有在数组中改变…的代码是:

echo `echo "${ids[@]}" | sort | uniq`

我究竟做错了什么?


阅读 250

收藏
2020-06-02

共1个答案

一尘不染

有点hacky,但是应该这样做:

echo "${ids[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' '

要将排序后的唯一结果保存回数组,请执行数组分配

sorted_unique_ids=($(echo "${ids[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' '))

如果您的外壳支持herestringsbash应该),则可以echo通过将其更改为以下内容来节省进程:

tr ' ' '\n' <<< "${ids[@]}" | sort -u | tr '\n' ' '

输入:

ids=(aa ab aa ac aa ad)

输出:

aa ab ac ad

说明:

  • "${ids[@]}"-使用shell数组的语法,无论是作为一部分echo还是在此处使用。该@部分的意思是“数组中的所有元素”
  • tr ' ' '\n'-将所有空格转换为换行符。因为您的数组被shell视为一行上的元素,并用空格分隔;并且因为sort期望输入在单独的行上。
  • sort -u -仅排序和保留唯一元素
  • tr '\n' ' ' -将我们先前添加的换行符转换回空格。
  • $(...)- 命令替换
  • 除了:tr ' ' '\n' <<< "${ids[@]}"是一种更有效的方法:echo "${ids[@]}" | tr ' ' '\n'
2020-06-02