책 색인과 같은 행 목록이 있습니다.
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
예약된 공간에 복사합니다. - 예약된 공간 내용을 들여쓰기된 줄(자식 줄)의 패턴 공간에 추가합니다
s/\(.*\)\n\(.*\)/\2\x02\1/
. 패턴 공간 라인을 삭제하고 \n
ewline을 교체한 다음 두 번째 라인까지 모두 삭제합니다.\x02
sort
\x02
sed 's/.*\x02//'