awk - 如果下一行不匹配模式,则删除行

时间:2014-09-10 06:30:50

标签: regex bash awk

我想解决以下问题,到目前为止我认为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

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

我尝试了各种正则表达式和sed魔法,但这似乎就像我认为的awk一样。但是,我不知道从哪里开始。

1 个答案:

答案 0 :(得分:4)

假设您的信息位于名为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)。

相关问题