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