![경로 목록에서 중복 경로 필터링](https://linux55.com/image/29690/%EA%B2%BD%EB%A1%9C%20%EB%AA%A9%EB%A1%9D%EC%97%90%EC%84%9C%20%EC%A4%91%EB%B3%B5%20%EA%B2%BD%EB%A1%9C%20%ED%95%84%ED%84%B0%EB%A7%81.png)
다음과 같은 상대 경로 목록이 있습니다.
dir1
dir2
dir2/dir3
dir2/file1
dir3/file2
dir3/dir4
dir3/dir4/file3
위의 예에서는 항목에 파일이 포함되므로 지정자 dir2/file1
(예:)가 중복됩니다 .dir2
본질적으로 내가 원하는 것은 주어진 경로 목록에서 중복된 경로를 제거하는 것입니다. 위의 예는 다음을 출력합니다.
dir1
dir2
dir3/file2
dir3/dir4
지정된 파일과 디렉터리가 실제로 파일 시스템에 존재할 필요는 없습니다.
나는 일반적인 Unix 명령(sed, awk, perl 등)을 사용할 의향이 있습니다.
답변1
상대 경로 목록이 파일 이름 "path"에 있다고 가정합니다.
다음 awk 스크립트를 사용하여 인쇄하여 원하는 출력을 얻을 수 있습니다.
$ awk 'BEGIN{FS="/";} {arr[$1]=$0;count[$1]+=1;} END{for(i in arr){if(count[i]==1){print arr[i]}else{print i}}}' path
그것이 어떻게 작동하는지 이해하시기 바랍니다.
답변2
글쎄, 나는 내 자신의 질문에 답할 것입니다.
@pradeepchhetri의 솔루션을 기반으로 나만의 awk 스크립트를 만들었습니다.
cat data.txt | sort | awk '
BEGIN{FS=OFS="/";}{
path=$0;
for(i=NF;i>0;i--){
NF--;
if($0 in paths){next;}
}
paths[path]=path;
}
END{for(path in paths){print path;}}' | sort
이것은 내 목적에 적합합니다.