这与问题“remove duplicate lines with similar prefix”非常相似,但恰恰相反:
给定输入的排序字符串(在本例中为目录),例如:
a/
a/b/c/
a/d/
bar/foo/
bar/foo2/
c/d/
c/d/e/
我想从输出中删除行,如果前一行是当前行的前缀。在这种情况下,输出将是:
a/
bar/foo/
bar/foo2/
c/d/
用 Python 等编写代码会很容易,但在这种情况下,我在 shell 环境中(bash、sort、sed、awk...)。 (重新排序没问题。)
最佳答案
使用 awk:
awk '{if(k && match($0, k))next; k="^"$0}1' file
k="^"$0 将模式锚定到字符串的开头。
在主 block 之前可能需要 NF>0
以防出现空行。
更新:如果变量 k
中存在正则表达式元字符,则可能会出现问题,下面不使用正则表达式的行应该更好:
awk '{if(k && index($0, k)==1)next; k=$0}1' file
Update-2:感谢@Ed,我已经调整了第二种方法以涵盖评估为零的非空行(不过空行将保持原样):
awk '{if(k!="" && index($0,k)==1)next;k=$0}1' file
关于bash - 如果前一行是前缀,则删除行(从输出中省略),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50547915/