I've got almost the same question as here.
I have an array which contains aa ab aa ac aa ad
, etc.
Now I want to select all unique elements from this array.
Thought, this would be simple with sort | uniq
or with sort -u
as they mentioned in that other question, but nothing changed in the array...
The code is:
echo `echo "${ids[@]}" | sort | uniq`
What am I doing wrong?
To create a new array consisting of unique values, ensure your array is not empty then do one of the following:
Remove duplicate entries (with sorting)
Remove duplicate entries (without sorting)
Warning: Do not try to do something like
NewArray=( $(printf '%s\n' "${OriginalArray[@]}" | sort -u) )
. It will break on spaces.Try this to get uniq values for first column in file
If you're running Bash version 4 or above (which should be the case in any modern version of Linux), you can get unique array values in bash by creating a new associative array that contains each of the values of the original array. Something like this:
This works because in an array, each key can only appear once. When the
for
loop arrives at the second value ofaa
ina[2]
, it overwritesb[aa]
which was set originally fora[0]
.Doing things in native bash can be faster than using pipes and external tools like
sort
anduniq
.If you're feeling confident, you can avoid the
for
loop by usingprintf
's ability to recycle its format for multiple arguments, though this seems to requireeval
. (Stop reading now if you're fine with that.)The reason this solution requires
eval
is that array values are determined before word splitting. That means that the output of the command substitution is considered a single word rather than a set of key=value pairs.While this uses a subshell, it uses only bash builtins to process the array values. Be sure to evaluate your use of
eval
with a critical eye. If you're not 100% confident that chepner or glenn jackman or greycat would find no fault with your code, use the for loop instead.I realize this was already answered, but it showed up pretty high in search results, and it might help someone.
Example:
If you want a solution that only uses bash internals, you can set the values as keys in an associative array, and then extract the keys:
This will output