나는 책의 색인과 같은 줄 목록을 가지고 있습니다.
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
텍스트 파일에서 발생할 가능성이 없는 문자를 선택하고, 상위 이름 + 해당 문자를 각 하위 줄 앞에 추가하고, 정렬한 다음 각 하위 줄에서 상위 이름과 구분 기호를 제거할 수 있습니다(예: gnu
sed 및 낮은 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
\x02
sed 's/.*\x02//'