remove a segunda linha de saída usando o awk

1

Eu tenho a seguinte saída:

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

Se eu ver a data 2: na saída eu quero remover toda a linha da saída. A segunda linha está lá se o desenvolvedor realmente adicionou um número de bug e uma explicação, mas em muitos checkins antigos eles não pegaram a data do checkin antes disso. Eu gostaria de ter o awk para remover qualquer segundo evento de data: junto com toda a linha de texto por trás dele.

estou fazendo um grep date | awk 'FNR & lt; 3' para pegar o texto que eu quero, mas eu gostaria de colocá-lo no awk novamente para remover a segunda linha de data ou combiná-la em um comando awk se for possível.

obrigado!

    
por Mike Wellum 26.10.2015 / 21:05

2 respostas

1

Usando awk e um arquivo de entrada com o nome foo

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

Saída

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

Se você tiver mais de um bloco de Filenamerevision em um arquivo, por exemplo

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

você deve usar

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

para obter

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
    
por A.B. 26.10.2015 / 22:06
1

Eu sei que a pergunta é feita especificamente para uma solução AWK, mas aqui está uma alternativa usando o Perl:

perl -ne 'if(/^date/){$x ne 0?$x=0:next}print' in
  • if(/^date/){[...]} : se a linha atual começar com uma string date , executa as instruções contidas em [...] ;
  • $x ne 0?$x=0:next : se x não for igual a 0, define x para 0; caso contrário, passa para a próxima linha;
  • print : imprime a linha atual
por kos 26.10.2015 / 22:43