짧은 공통 루트 디렉터리를 기반으로 디렉터리 목록 텍스트 파일을 필터링합니다.

짧은 공통 루트 디렉터리를 기반으로 디렉터리 목록 텍스트 파일을 필터링합니다.

.txt 파일에 다음과 유사한 디렉터리 목록이 있습니다.

/Season_1/101
/Season_1/101/Thumbnails
/Season_1/101/Thumbnails/Branded
/Season_1/101/massive_screengrabs
/Season_1/102/massive_screengrab
/Season_1/102/thumbnails
/Season_1/102/thumbnails/Branded
/Season_1/103/Thumbnails
/ARCHIVE/480x360 v6/Season 2
/ARCHIVE/480x360 v6/Season 3
/ARCHIVE/480x360 v6/Season 4

목록의 나머지 부분과 비교하여 가장 짧은 공통 루트를 기반으로 디렉터리를 필터링하는 방법을 찾고 있습니다. 결과는 아래와 같습니다.

/Season_1/101
/Season_1/102/massive_screengrab
/Season_1/102/thumbnails
/Season_1/103/Thumbnails
/ARCHIVE/480x360 v6/Season 2
/ARCHIVE/480x360 v6/Season 3
/ARCHIVE/480x360 v6/Season 4

또 다른 요구 사항은 무작위로 이름이 지정된 다양한 디렉터리와의 호환성입니다. 따라서 이 특정 예를 해결하기 위해 "/Season_1/101"과 같은 문자열을 사용하는 것은 디렉터리 이름을 무엇이든 지정할 수 있으므로 작동하지 않습니다.

어떤 도움이라도 대단히 감사하겠습니다.

답변1

다음 명령은 빈 줄이 포함되지 않은 텍스트 파일에서 작동합니다. 빈 줄을 수용해야 하는 경우 몇 가지 수정이 필요합니다.

cat textfile | sort | awk 'BEGIN { FS="/" }; { if ( NR == 1 || $0 !~ lastField ) { print $0; lastField = $NF } }' > newtextfile

textfile텍스트 파일은 어디에 있고 newtextfile결과를 어디에 출력하고 싶습니까? > newtextfile표준 출력에서 ​​결과를 보려면 생략할 수 있습니다.

awk가 유사한 줄의 가장 짧은 버전부터 시작하여 레코드별로 반복하도록 파일이 먼저 정렬됩니다. awk는 주어진 레코드의 마지막 부분이 다음 줄에 포함되어 있는지 여부를 결정합니다. 중복되지 않은 라인만 출력합니다.

관련 정보