Preface
Goal: Exploring Fish Shell for string processing.
4: Approach in Solving Unique
A custom example, that you can rewrite.
An Algorithm Case
Why reinvent the wheel?
The same reason as other article.
x:xs Pattern Matching
The same with other article as well.
Exclude Function
Consider array in code below:
set tags \
"60s" "jazz" "60s" "rock" \
"70s" "rock" "70s" "pop"The exclude function is just a filter.
Unfortunately, fish does not have diff operator,
such as ${tags[@]/$val} in bash.
function exclude
set -l value $argv[1]
set -e argv[1]
set -l tags $argv
for i in (seq (count $tags) -1 1)
if [ $tags[$i] = $value ]
set -e tags[$i]
end
end
string join \n $tags
endFinally we can call them in main script.
and reformat the output using fish.
string join ':' (exclude "rock" $tags)With the result as below array:
❯ ./11-exclude.sh
60s:jazz:60s:70s:70s:pop
The fish script looks tidier than bash.
Recursive Unique Function
With exclude function above,
we can build unique function recursively, as below code:
function unique
if [ (count $argv) -le 1 ]
echo $argv
else
set -l head $argv[1]
set -e argv[1]
set -l tail $argv
set -l tags (exclude $head $tail)
set -l tags (string join \n $tags)
set -l uniq (unique $tags)
set -l return $head
set -a return $uniq
string join \n $return
end
end
Again, unfortunately, I can’t get rid of exclude function.
Because fish does not have array diff operator, or such equivalent.

Applying Unique to Simple Array
Now we can apply the method to our unique song challenge.
#!/usr/bin/env fish
set tags \
"60s" "jazz" "60s" "rock" \
"70s" "rock" "70s" "pop"
source ./MyHelperUnique.sh
string join ':' (unique $tags)With the same result as below

With the result as below array:
❯ ./12-unique-a.sh
60s:jazz:rock:70s:popApplying Unique to data Structure
We can also apply the method to our unique song challenge.
#!/usr/bin/env fish
source ./MySongs.sh
source ./MyHelperFlatten.sh
source ./MyHelperUnique.sh
# Extract flatten output to array
set tags (flatten $songs | sort -u)
string join ':' (unique $tags)With the result as below array:
❯ ./12-unique-b.sh
60s:70s:jazz:pop:rock
What is Next 🤔?
Consider continue reading [ Ion Shell - Playing with Records - Part One ].