如何从头开始删除所有行,直到达到特定模式,最后一行除外

How do I remove all lines starting from the beginning until I reach a certain pattern, except from the last one

示例:

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

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

谢谢

预期输出:

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

方法是按照您已经建议的方式使用 awk。正如您所说,您想打印从第一次出现的 3 个字段开始的行,这可以通过设置打印标志轻松完成(我们称之为 p)'

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

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

但是,您还想打印包含字符串 "title" 的行。这可以通过匹配这个字符串来完成:

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

这个问题是当你的文件看起来像

时,'title'这个词可能会被打印两次
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

而您只想打印 "title 2"

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

如果 "title" 只引用第一行之前的 3 个字段,那么你

awk '(NF==3){p=1;print s};p;{s=[=16=]}' file

或小幅加速:

awk '(NF==3){p=1;print s};p{print; next}{s=[=17=]}' file