A bit hacky, but this should do it:
echo "${ids[@]}" | tr ' ' '
' | sort -u | tr '
' ' '
To save the sorted unique results back into an array, do Array assignment:
sorted_unique_ids=($(echo "${ids[@]}" | tr ' ' '
' | sort -u | tr '
' ' '))
If your shell supports herestrings (bash
should), you can spare an echo
process by altering it to:
tr ' ' '
' <<< "${ids[@]}" | sort -u | tr '
' ' '
A note as of Aug 28 2021:
According to ShellCheck wiki 2207 a read -a
pipe should be used to avoid splitting.
Thus, in bash the command would be:
IFS=" " read -r -a ids <<< "$(echo "${ids[@]}" | tr ' ' '
' | sort -u | tr '
' ' ')"
or
IFS=" " read -r -a ids <<< "$(tr ' ' '
' <<< "${ids[@]}" | sort -u | tr '
' ' ')"
Input:
ids=(aa ab aa ac aa ad)
Output:
aa ab ac ad
Explanation:
"${ids[@]}"
- Syntax for working with shell arrays, whether used as part of echo
or a herestring. The @
part means "all elements in the array"
tr ' ' '
'
- Convert all spaces to newlines. Because your array is seen by shell as elements on a single line, separated by spaces; and because sort expects input to be on separate lines.
sort -u
- sort and retain only unique elements
tr '
' ' '
- convert the newlines we added in earlier back to spaces.
$(...)
- Command Substitution
- Aside:
tr ' ' '
' <<< "${ids[@]}"
is a more efficient way of doing: echo "${ids[@]}" | tr ' ' '
'
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…