假设我有一个绝对路径的排序列表,就像我在此处的答案中的列表一样(针对此问题进行了缩短和修改):
/proc
/proc/sys/fs/binfmt_misc
/proc/sys/fs/binfmt_misc
/run
/run/cgmanager/fs
/run/hugepages/kvm
/run/lock
/run/user/1000
/run/user/1000/gvfs
/tmp
/home/bytecommander/ramdisk
我想要的是通过消除前面提到的路径的子目录的所有路径来减少这个列表。这意味着,对于给定的输入,我想要这个输出:
/proc
/run
/tmp
/home/bytecommander/ramdisk
如何使用例如 Bash sed
、awk
或任何其他常用工具在命令行中轻松完成此操作?适合一行的简短解决方案值得赞赏,但不是必需的。
AWK
它的工作方式很简单,但是命令的顺序很重要。我们首先记录第一行是什么并打印出来。我们转到下一行并检查下一行是否包含先前的文本。如果是这样——我们什么也不做。如果没有 - 那是一条不同的新路径。
当存在具有相同前导子字符串的相邻路径时,原始方法存在缺陷并且失败,例如
/var/zomg
和/var/zomgkthx
(感谢 Chai T.Rex 指出这一点)。诀窍是将“/”附加到旧路径以表示它的结束,从而破坏子字符串。下面的 python 替代方案中使用了相同的方法。Python替代品
样品运行:
这种方法类似于 awk-one。想法是一样的:记录第一行,只有当我们遇到没有跟踪变量作为起始子字符串的行时,才继续打印和重置跟踪变量。
或者,也可以使用
os.path.commonprefix()
函数。另一个 Python 版本,使用新
pathlib
库: