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

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

나는 책의 색인과 같은 줄 목록을 가지고 있습니다.

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- 들여쓰기된 줄(자식)에서 보류 공간 콘텐츠를 패턴 공간에 추가 - 패턴 공간의 줄을 그 뒤의 ewline으로
s/\(.*\)\n\(.*\)/\2\x02\1/교체하고 제거 2차를 포함한 모든 것\n\x02
sort\x02sed 's/.*\x02//'

관련 정보