들여쓰기된 행을 상위 행과 그룹화하면서 행을 정렬합니다.

들여쓰기된 행을 상위 행과 그룹화하면서 행을 정렬합니다.

책 색인과 같은 행 목록이 있습니다.

day
    satur-
    sun-
    holy-
night
    ball
    to-
eve
    election
    christmas

day이제 나는 이 줄을 명확한 방법으로 정렬하고 싶습니다. 각 "상위" 항목( , night, eve)을 각각의 들여쓰기된 "하위" 항목( satur-, , ...)과 그룹화하고 상위 항목별로 쌍을 이루고 싶습니다. sun-이 그룹은 정렬됩니다. . 또한 특정 그룹 내의 하위 항목을 정렬하고 싶습니다.

따라서 원하는 출력은 다음과 같습니다.

day
    holy-
    satur-
    sun-
eve
    christmas
    election
night
    ball
    to-

이와 같은 Unix 핵심 도구를 사용하여 이를 가장 잘 달성할 수 있는 방법은 무엇입니까 sort?

답변1

텍스트 파일에 나타날 가능성이 없는 문자를 선택하고, 각 하위 줄에 상위 이름 + 해당 문자를 추가하고, 정렬한 다음 각 하위 줄에서 상위 이름과 구분 기호를 제거할 수 있습니다(예: gnused 및 낮은 ASCII 문자 사용).\x02

sed '/^[^[:blank:]]/h;//!G;s/\(.*\)\n\(.*\)/\2\x02\1/' infile | sort | sed 's/.*\x02//'

작동 방식:
첫 번째 작업은 sed다음을 수행합니다.
/^[^[:blank:]]/h- 들여쓰기되지 않은 줄(상위 줄)을
//!G예약된 공간에 복사합니다. - 예약된 공간 내용을 들여쓰기된 줄(자식 줄)의 패턴 공간에 추가합니다
s/\(.*\)\n\(.*\)/\2\x02\1/. 패턴 공간 라인을 삭제하고 \newline을 교체한 다음 두 번째 라인까지 모두 삭제합니다.\x02
sort\x02sed 's/.*\x02//'

관련 정보