![从路径列表中过滤冗余路径](https://linux22.com/image/29690/%E4%BB%8E%E8%B7%AF%E5%BE%84%E5%88%97%E8%A1%A8%E4%B8%AD%E8%BF%87%E6%BB%A4%E5%86%97%E4%BD%99%E8%B7%AF%E5%BE%84.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
这对我的目的有用。