With `zsh` instead, you could define a function like:
```
reduce() {
local i=1
argv=(${(s:,:)1})
while ((i < $#)) {
if ((${argv[i]#*-} + 1 == ${argv[i+1]%-*})) {
argv[i]=${argv[i]%-*}-${argv[i+1]#*-}
argv[i+1]=()
} else {
(( i++ ))
}
}
print ${(j:,:)@}
}
```
Which would also accept ranges on input:
```
$ reduce 1,2,3,5,6,7,8,9,12,14
1-3,5-9,12,14
$ reduce 1,2,3,5-7,8,9-11,12,13-20
1-3,5-20
```