我有一个包含目录列表的文件:
/a/b
/a/b/c
/a/b/d
/a/b/e
/a/c
/a/c/b
/a/c/d
/a/d/e
/a/d/e /f
/a/e/f/g
/a/e/f/g/h
...
我只想得到 /a/b、/a/c、/a/d/e 和 /a/e/f/g;也就是说,我想排除在其之前具有另一行子集的行。子目录的深度是任意的,所以我可以在 2、3、4 等目录下找到唯一的子目录。
我有一个包含目录列表的文件:
/a/b
/a/b/c
/a/b/d
/a/b/e
/a/c
/a/c/b
/a/c/d
/a/d/e
/a/d/e /f
/a/e/f/g
/a/e/f/g/h
...
我只想得到 /a/b、/a/c、/a/d/e 和 /a/e/f/g;也就是说,我想排除在其之前具有另一行子集的行。子目录的深度是任意的,所以我可以在 2、3、4 等目录下找到唯一的子目录。
假设您的输入已排序,那么检查前缀并在更改时更新它如何?
注意:这是一个正则表达式匹配,因此如果条目包含正则表达式特殊字符可能不合适 - FWIW 既不
gawk
或mawk
似乎/
在此上下文中将 视为特殊字符输出
如果您没有 GNU awk,则将输出通过管道传输到
| sort
我们将字段分隔符设置为
/
,然后打印仅包含三个字段的行。假设您的输入文件格式是一致的,只会/a/b
打印诸如 的行,因为这三个字段依次是空字符串a
、 和b
。你必须使用awk吗?格雷普可以做到。Tyy 是这样的: egrep '^/a/b\$|/a/c\$'
根据您的外壳,$ 可能需要也可能不需要使用反斜杠进行转义。
您可以使用
sed
编辑器执行此操作,如下所示:在职的:
如果输入没有排序,您可以通过以下方式进行:
在职的: