如何删除从头开始的所有行,直到达到某种模式为止(最后一个模式除外)

时间:2018-07-16 11:15:49

标签: linux bash csh

示例:

>"one"
>"two"
>"three"
>"title"
>12 23 14
>...

我想删除开头的所有行,直到到达其中NF==3(awk)但名称为“ title”的行,并且在文件开头只删除一次,不会重复。

谢谢

预期输出:

>"title"
>12 23 14
>...

1 个答案:

答案 0 :(得分:0)

执行此操作的方法是使用您已经建议的awk。就像您说的那样,您要从具有3个字段的第一次出现开始打印行,这可以通过设置打印标志(将其称为p)来轻松完成。

awk '(NF==3){p=1};p' file

这将打印从第一行开始的所有内容,其中包含3个字段。

但是,您还希望打印包含字符串“ title” 的行。这可以通过匹配以下字符串来完成:

awk '/title/{print}(NF==3){p=1};p' file

问题是,当文件看起来像“标题”一词时,可能会打印两次

a          < not printed
title      < printed
a b c      < printed
title      < printed twice
e f g      < printed
h          < printed

因此,在这里您必须更加谨慎地使用逻辑,并将支票与何时打印的支票放在一起:

awk '(NF==3){p=1};(p || /title/)' file

这又不是很可靠,因为您可能有以下文件:

a          < not printed
title 1    < printed
b          < not printed
title 2    < printed
a b c      < printed
h          < printed

,而您只希望打印“标题2”

awk '/title/{s=$0}(NF==3){p=1;print s};p' file

如果“标题”仅指第一行之前的包含3个字段的行,那么您可以这样做

awk '(NF==3){p=1;print s};p;{s=$0}' file

或略微加速:

awk '(NF==3){p=1;print s};p{print; next}{s=$0}' file