示例:
>"one"
>"two"
>"three"
>"title"
>12 23 14
>...
我想删除开头的所有行,直到到达其中NF==3
(awk)但名称为“ title
”的行,并且在文件开头只删除一次,不会重复。
谢谢
预期输出:
>"title"
>12 23 14
>...
答案 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