使用 awk 删除第二行输出

使用 awk 删除第二行输出

我有以下输出:

Filename:xxxxxxxx
date: 2014/12/24 14:46:41;  author: xxxxx;  state: Exp;  lines: +210 -206
date: 2014/11/18 21:00:43;  author: xxxxx;  state: Exp;  lines: +617 -594
revision 1.23

如果我在输出中看到 2 date:,我想从输出中删除整行。如果开发人员确实添加了错误编号和说明,则会出现第二行,但在许多较旧的签入中,他们没有这样做,因此它会从之前的签入中获取日期。我想让 awk 删除任何第二次出现的 date: 以及它后面的整行文本。

所以我做了 grep date|awk 'FNR <3' 来获取我想要的文本,但我想再次通过 awk 清除第二个日期行,或者尽可能将其组合成一个 awk 命令。

谢谢!

答案1

使用awk名为foo

awk '! /^date/ {print} /^date/ && ! a {a=1; print}' foo

输出

Filename:xxxxxxxx
date: 2014/12/24 14:46:41;  author: xxxxx;  state: Exp;  lines: +210 -206
revision 1.23

如果一个文件中有多个Filename…块,例如revision

Filename:xxxxxxxx
date: 2014/12/24 14:46:41;  author: xxxxx;  state: Exp;  lines: +210 -206
date: 2014/11/18 21:00:43;  author: xxxxx;  state: Exp;  lines: +617 -594
revision 1.23
Filename:xxxxxxxx
date: 2014/12/24 14:46:41;  author: xxxxx;  state: Exp;  lines: +210 -206
date: 2014/11/18 21:00:43;  author: xxxxx;  state: Exp;  lines: +617 -594
revision 1.23

你应该使用

awk '! /^date/ {a=0; print} /^date/ && ! a {a=1; print}' foo

要得到

Filename:xxxxxxxx
date: 2014/12/24 14:46:41;  author: xxxxx;  state: Exp;  lines: +210 -206
revision 1.23
Filename:xxxxxxxx
date: 2014/12/24 14:46:41;  author: xxxxx;  state: Exp;  lines: +210 -206
revision 1.23

答案2

我知道该问题专门要求使用 AWK 解决方案,但这里有一个使用 Perl 的替代方法:

perl -ne 'if(/^date/){$x ne 0?$x=0:next}print' in
  • if(/^date/){[...]}:如果当前行以字符串开头,则执行包含在;date中的语句[...]
  • $x ne 0?$x=0:next:如果x不等于0,则设置x为0;否则移动到下一行;
  • print:打印当前行

相关内容