bash - 如果前一行是前缀,则删除行(从输出中省略)

标签 bash awk

这与问题“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/

相关文章:

bash - 并排连接两个文件,附加字段之间的差异,并以表格格式打印

bash - 如何删除日志文件中超过 14 天的行?

linux - 调整 awk 以在正则表达式匹配或不匹配时打印不同的内容

python - 从 bash : Command not found error 运行 Python 脚本

perl - perl 上的 coreutils 超时模拟

node.js - 在 Ubuntu 20.04 LTS 上安装 NVM?

linux - awk 打印不带引号的值

linux - 将 Mac 地址保存在 bash 脚本中的变量中并使用它来检查更改

sorting - 最高 awk 结果被计数条件截断

bash - 用 bash 中的另一列替换 CSV 文件中的列