【问题标题】:Delete certain lines matching pattern in multiple files in a directory删除目录中多个文件中与模式匹配的某些行
【发布时间】:2016-03-08 20:22:58
【问题描述】:

我在名为mydirectory 的目录中有多个.csv 文件。每个文件都包含以#GENE_ANNOTATIONS 开头的行。我想删除该行之前的所有行,包括该行加上该行下方的一行。我希望将其应用于所有文件并保存它们。是否有任何 unix/awk/perl 命令可以执行此操作?

【问题讨论】:

  • @MattJacob 这是什么?您能以不那么美国的方式分享这些吗?
  • 当然。向我展示您迄今为止所做的工作,我很乐意帮助您解决任何问题。

标签: perl unix awk sed


【解决方案1】:

使用 GNU sed:

sed -i '0,/^#GENE_ANNOTATIONS/{/^#GENE_ANNOTATIONS/{N};d;}' mydirectory/*

【讨论】:

  • 我认为这可能无法按预期工作,因为每次执行 sed 命令时,都会将两行读入模式空间。也许您的意图是只有最后一行会读入额外的一行,即sed -i '1,/^#GENE_ANNOTATIONS/{/^#GENE_ANNOTATIONS/N;d;}' mydirectory/*
  • @potong:谢谢你的提示。我已经更新了我的答案并修复了第二个错误。如果#GENE_ANNOTATIONS 是第一行,它现在也可以工作。
  • 干得好,如果你愿意,你可以去掉 N 命令上的花括号,减少一点:sed '1,/^#GENE_ANNOTATIONS/{/^#GENE_ANNOTATIONS/N;d}' file.txt。对于那些相对不熟悉sed 的人来说,另一种逻辑上容易的方法是两次调用sedsed '1,/#GENE_ANNOTATIONS/d' file.txt | sed '1d'
  • @A.Danischewski:是的,两者都是可能的。谢谢你的提示。
【解决方案2】:

这可能对你有用(GNU sed):

sed -ni '/^#GENE_ANNOTATIONS/,$!b;n;n;:a;p;n;ba' mydirectory/*

通过启用-n 开关仅打印您想要的行。

另一种选择:

sed  '/^#GENE_ANNOTATIONS/,$!d;x;/./{g;b};x;h;N;d' mydirectory/*

【讨论】:

    猜你喜欢
    • 2011-05-14
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 2015-11-06
    • 2017-03-18
    • 2015-04-25
    • 2022-01-02
    • 2012-01-27
    相关资源
    最近更新 更多