我有以下输出:
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
:打印当前行