remove as linhas sequenciais que começam com o mesmo padrão usando awk ou sed

0

Eu quero remover as linhas sequenciais que começam com o mesmo padrão "CREATE CURRENT" usando sed ou awk, por exemplo, se você tiver o arquivo folowwing:

CREATE CURRENT = 'aaaa' ;
CREATE CURRENT = 'bbbb' ;
CREATE CURRENT = 'aaaa' ;
CREATE CURRENT = 'dddd' ;
THIS IS A PARAGRAPH 1 ;
THIS IS A PARAGRAPH 1-1
CREATE CURRENT = 'cccc' ;
THIS IS A PARAGRAPH 2 ;
THIS IS A PARAGRAPH 2-2

o resultado seria como

CREATE CURRENT = 'dddd' ;
THIS IS A PARAGRAPH 1 ;   
THIS IS A PARAGRAPH 1-1 
CREATE CURRENT = 'cccc' ;
THIS IS a PARAGRAPH 2
THIS IS a PARAGRAPH 2-2 ;
    
por malmo 17.03.2016 / 10:48

3 respostas

0

tente

awk '{ if ( $1 "x" != before "x" ) print ; before=$1 ; } ' file

onde

  • $1 "x" != before "x" test com o valor anterior do primeiro campo
  • before "x" whith implicit string concat permite primeiro não inicializado antes do valor
  • before=$1 lembra do valor anterior de $ 1.

Atualize com a edição do OP:

awk 'BEGIN {cc=0 } 
    /CREATE CURRENT/ { if ( !cc++) print ; else next ;} 
    {cc=0; print ;} '
    As linhas
  • consecutivas com CREATE CURRENT são impressas apenas uma vez
  • outras linhas reinicializam cc value
  • você pode adicionar uma nova linha em ' ' ou colocar tudo em uma linha.
por 17.03.2016 / 10:56
0

Eu tentei este sed e está funcionando

sed '/^CREATE CURRENT/ { :a $! { N; /\nCREATE CURRENT/ { s/.*\n//; ba; }; }; }' file

aqui está o resultado

CREATE CURRENT = 'dddd' ;
THIS IS A PARAGRAPH 1 ;
THIS IS A PARAGRAPH 1-1
CREATE CURRENT = 'cccc' ;
THIS IS A PARAGRAPH 2 ;
THIS IS A PARAGRAPH 2-2
    
por 17.03.2016 / 12:00
0

Abra em vi e você pode usar:

:%s/\(\(\_^CREATE CURRENT\).*\n\)\(.*\n\)*//g

Isso pode deixar uma nova linha extra no final do arquivo se você tiver CREATE CURRENT linhas no final do arquivo. Em caso afirmativo, você pode excluir a linha extra com :$d .

Se você estiver satisfeito, salve-o com :x ou descarte as alterações e saia usando :q!

Para manter o último de cada conjunto de duplicados em vez do primeiro, use:

:%s/\(\(\_^CREATE CURRENT\).*\n\)\+\(.*\n\)//g
    
por 17.03.2016 / 11:20

Tags