【问题标题】:awk - delete line if next lines don't match patternawk - 如果下一行与模式不匹配,则删除行
【发布时间】:2014-09-10 14:39:29
【问题描述】:

我想解决以下问题,到目前为止,我认为 awk 可能也是正确的,但如果我错了,请证明我。

我有一个遵循此方案的控制台输出:

HEADER: HeaderInfo1
Details 1
Details 2
HEADER: HeaderInfo2
HEADER: HeaderInfo3
Details 3
Details 4
HEADER: HeaderInfo4

我想将其转换为以下内容:

HeaderInfo1: Details 1
HeaderInfo1: Details 2
HeaderInfo3: Details 3
HeaderInfo3: Details 4

如您所见,每个 Detail 都属于最近的标题。每个标题的详细信息数量是可变的 应忽略空标题。

我尝试了各种正则表达式和 sed 魔法,但我认为这似乎是 awk 的一个案例。但是我不太清楚从哪里开始。

【问题讨论】:

  • 抱歉,打错了。你当然是对的。我改正了

标签: regex bash awk


【解决方案1】:

假设您的信息在一个名为 info 的文件中:

$ awk '/^HEADER/{hdr=$2;next} {print hdr": "$0}' info
HeaderInfo1: Details 1
HeaderInfo1: Details 2
HeaderInfo3: Details 3
HeaderInfo3: Details 4

说明

awk 程序分为两部分:

  • /^HEADER/{hdr=$2;next}

    对于以HEADER 开头的行,第二个字段保存在变量hdr 中,然后awk 被指示跳到下一行。

  • {print hdr": "$0}

    对于所有其他行,打印标题 hdr 的最新值,后跟一个冒号,然后是行 ($0)。

【讨论】:

  • 这非常完美!非常感谢!使用正确的工具以及力量是否强大,这项任务是多么容易,这真是太疯狂了。必须了解更多 awk
最近更新 更多