从路径列表中过滤冗余路径

从路径列表中过滤冗余路径

我有一个相对路径列表,如下所示:

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

这对我的目的有用。

相关内容