A very short awk answer for a single line input that handling all cases below (number scanning is from left-to-right direction in all cases) unlike other currently existing answers that failing on these all and they mostly handles only case#2:
$ awk -v RS=, 'function prnt(){ printf sep start (end==start?"":"—"end) ; sep=RS }
end!="" && ( end==$0-1 || end==$0+1) { end=$0; next }
end!="" { prnt() }
{ start=end=$0 }
END{ prnt() }'
1. numbers are in descending order:
$ awk -v RS=, 'function prnt(){ printf sep start (end==start?"":"—"end) ; sep=RS }
end!="" && ( end==$0-1 || end==$0+1) { end=$0; next }
end!="" { prnt() }
{ start=end=$0 }
END{ prnt() }' <<<'14,13,12,11,9,8,7,3,2,1,0,-1'
14—11,9—7,3—-1
2. numbers are in ascending order:
$ awk -v RS=, 'function prnt(){ printf sep start (end==start?"":"—"end) ; sep=RS }
end!="" && ( end==$0-1 || end==$0+1) { end=$0; next }
end!="" { prnt() }
{ start=end=$0 }
END{ prnt() }' <<<'1,2,3,5,6,7,8,9,12,14'
1—3,5—9,12,14
3. numbers are in unsorted order:
$ awk -v RS=, 'function prnt(){ printf sep start (end==start?"":"—"end) ; sep=RS }
end!="" && ( end==$0-1 || end==$0+1) { end=$0; next }
end!="" { prnt() }
{ start=end=$0 }
END{ prnt() }' <<<'10,3,4,5,6,2,1,5,6,7,9,7,2,3'
10,3—6,2—1,5—7,9,7,2—3
To applying on a file containing multiple of these lines like:
$ cat infile
14,13,12,11,9,8,7,3,2,1,0,-1
1,2,3,5,6,7,8,9,12,14
-1,0,1,2,4,3,2,1,0,-1,-2,-2,-2,-2,-4
10,3,4,5,6,2,1,5,6,7,9,7,2,3
and adjusting the script a bit:
$ awk -v RS=, 'function prnt(){ printf sep start (end==start?"":"—"end) ; sep=RS }
/\n/{
printf "%s\n", sep start ((end==$1-1 || end==$1+1)?"—":sep) $1;
sep=""; start=end=$2; next
}
end!="" && ( end==$0-1 || end==$0+1) { end=$0; next }
end!="" { prnt() }
{ start=end=$0 }' infile
Output:
14—11,9—7,3—-1
1—3,5—9,12,14
-1—2,4—-2,-2,-2,-2,-4
10,3—6,2—1,5—7,9,7,2—3