如何从头开始删除所有行,直到达到特定模式,最后一行除外
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
示例:
>"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