Я был бы очень удивлен, если бы это можно было сделать в sed
. Вы можете написать чистый bash-скрипт, но в awk
это довольно просто. Эта программа чем-то похожа на Кусалананды . но не использует массив.
awk -F, '
{
begin=$1
prev=$1
for (i=2; i<=NF; i++) {
if ($i == prev+1) {
prev=$i
continue
}
if (begin==prev) {
printf "%s,", begin
} else {
printf "%s-%s,", begin, prev
}
begin=$i
prev=$i
}
if (begin==prev) {
printf "%s", begin
} else {
printf "%s-%s", begin, prev
}
print ""
}'
-F,
устанавливает разделитель полей, поэтому мы можем рассматривать каждое число как поле. begin
— первое число в текущем диапазоне последовательных номеров. prev
всегда является самым последним числом, которое мы просматривали. Мы могли бы просто сказать $(i-1)
; Я подумал, что будет понятнее дать ему имя. print ""
, чтобы напечатать новую строку.