연속된 숫자를 범위로 축소하는 방법은 무엇입니까?

연속된 숫자를 범위로 축소하는 방법은 무엇입니까?

고유한 숫자(한 줄에 하나씩)가 포함된 정렬된 입력 파일(또는 명령 출력)이 주어지면 연속된 숫자의 모든 실행을 하나의 범위로 축소하고 싶습니다.

n
n+1
...
n+m

~이 되다

n,n+m

입력 샘플:

2
3
9
10
11
12
24
28
29
33

예상 출력:

2,3
9,12
24
28,29
33

답변1

dc정신적 훈련을 하십시오 :

dc -f "$1" -e '
[ q ]sB
z d 0 =B sc sa z sb
[ Sa lb 1 - d sb 0 <Z ]sZ
lZx
[ 1 sk lf 1 =O lk 1 =M ]sS
[ li p c 0 d sk sf ]sO
[ 2 sf lh d sj li 1 + !=O ]sQ
[ li n [,] n lj p c 0 sf ]sM
[ 0 sk lh sj ]sN
[ 1 sk lj lh 1 - =N lk 1 =M ]sR
[ 1 sf lh si ]sP
[ La sh lc 1 - sc lf 2 =R lf 1 =Q lf 0 =P lc 0 !=A ]sA
lAx
lSx
'

답변2

awk '
    function output() { print start (prev == start ? "" : ","prev) }
    NR == 1 {start = prev = $1; next}
    $1 > prev+1 {output(); start = $1}
    {prev = $1}
    END {output()}
'

답변3

awk, 다른 (더 유사한 C) 접근 방식을 취합니다.

awk '{ do{ for(s=e=$1; (r=getline)>0 && $1<=e+1; e=$1); print s==e ? s : s","e }while(r>0) }' file

똑같지만 훨씬 덜 어색합니다.

awk 'BEGIN{
    for(r=getline; r>0;){
        for(s=e=$1; (r=getline)>0 && $1<=e+1; e=$1);
        print s==e ? s : s","e
    }
    exit -r
}' file

답변4

또 다른 awk방법(변형)글렌답변):

awk '
    function output() { print start (start != end? ","end : "") }
    end==$0-1 || end==$0 { end=$0; next }
    end!=""{ output() }
    { start=end=$0 }
END{ output() }' infile

관련 정보