linux - 如何删除从头开始直到达到特定模式的所有行(最后一行除外)

标签 linux bash csh

示例:

>"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/

相关文章:

linux - 无与伦比的'。设置别名时出错

c - 如何在服务器线程和客户端线程之间同步?

linux - 无法连接到远程 mongodb 服务器

Python:子进程并运行具有多个参数的 bash 脚本

java - 如何从 Linux 的输出中删除(过滤掉)特定的 Java 堆栈跟踪?

bash - 从 ssh session 中检测 user@hostname

linux - SED 命令替换

loops - 如何在csh中为foreach添加循环计数器

linux - GNUPLOT 无法放大

linux - 下载网页的脚本