在我看来,您的记录包含两个字段,即 TITLE 和 DATA,如果您缺少第二个字段,您想删除该记录。但这不是你在问题中问的。因此,这是执行您要求的一种方法:
awk '/^TITLE/&&!t{t=$0} /^DATA/&&t{print t;print;t=""}' inputfile
这里的想法是,当我们看到一个变量并且还没有一个标题集时,我们将它设置为一个 TITLE,然后只在我们看到一个 DATA 时打印它。如果我正确阅读了您的问题,这适用于您提供的输入数据。输出是:
TITLE something
DATA some data
TITLE something else
DATA some other data
TITLE some more
DATA some more data
如您所见,数据集中的最后一个 TITLE 行已被删除。
这是在 awk 中执行此操作的另一种方法...
awk '/^TITLE/&&t{next} t=0; /^TITLE/{t=1} 1' inputfile
t
在这一个中,如果已设置,第一个表达式会跳过标题。第二个表达式 unsets t
。第三个表达式为标题设置 if,最后一个表达式 ( 1
) 打印该行。当然,如果我们跳过第一个表达式中的行,最后三个表达式就不会运行。它生成与上面相同的输出,并且不费心查看/^DATA/
.
最后,这是代码最少但逻辑最奇怪的一个:
awk '/^DATA/ || !t; {t=/^TITLE/}' inputfile
它打印所有数据行,或任何t
未设置的行,然后有效地设置t
为布尔值,影响下一行的评估。如果您在 csh 或 tcsh 中执行此操作,请注意感叹号,在这些 shell 中可能需要转义。