示例:
>"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
这样做的问题是,当您的文件看起来像这样时,“标题”一词可能会被打印两次
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
关于linux - 如何删除从头开始直到达到特定模式的所有行(最后一行除外),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51360525/