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
```