Encontre linhas entre dois padrões e acrescente linhas com padrão

0

Eu realmente aprecio os gurus de script para ajudar lá fora. Muito obrigado antecipadamente.

Temos o seguinte arquivo, onde um monte de registros (milhões de registros) de interesse estão entre o início e o fim dos padrões. O padrão de início sempre começa com um A e o padrão final sempre começa com um Z.

Apattern1   somethinghere    #start of pattern always starts with A
Line-of-data-here-aaa
Line-of-data-here-xxxxx
Zpattern1  #end of pattern always starts with Z
ApatternX   somethinghere    #Repeat: start of pattern always starts with A
Line-of-data-here-bbbb
Line-of-data-here-yyyy
Line-of-data-here-nnnnn
ZpatternX

Queremos transformar os dados anexando o padrão inicial (linha inteira) às linhas dentro do padrão. Queremos remover o padrão final. Queremos usar sed e / ou awk para acrescentar as linhas que iniciam o padrão (começa com A) para as linhas dentro do padrão (começa com L) e se livrar do final do padrão (sempre começa com Z). arquivo de dados ficaria assim:

Apattern1   somethinghere  Line-of-data-here-aaa
Apattern1   somethinghere   Line-of-data-here-xxxxx
ApatternX   somethinghere   Line-of-data-here-bbbb
ApatternX   somethinghere  Line-of-data-here-yyyy
ApatternX   somethinghere  Line-of-data-here-nnnnn
    
por N.E 01.08.2017 / 15:54

2 respostas

1

Pelo que entendi sua pergunta, você está pedindo por isso:

sed -E '/^A/h;/^[AZ]/d;G;s/(.*)\n(.*)/ /' yourfile

Assim, as linhas que começam com A são copiadas para o espaço de espera ( /^A/h ), então as linhas que começam com A ou Z são excluídas, pois não queremos imprimi-las ( /^[AZ]/d ). Para todas as outras linhas, o espaço de espera com a linha A é adicionada ( G ), ambas as partes são trocadas separadas por um espaço em branco em vez de uma nova linha ( s/(.*)\n(.*)/ / )

(Um pouco mais fácil com uma expansão de sed que fiz por mim mesmo: \h na substituição é expandida para o conteúdo do buffer de retenção:

sed -E '/^A/h;/^[AZ]/d;G;s/^/\h /' yourfile

Se eu encontrar mais perguntas como essa, farei uma solicitação de mesclagem para ela.

    
por 01.08.2017 / 16:05
0
sed -e '
   /^A/,/^Z/!d
   //{h;d;}
   G;s/\(.*\)\n\(.*\)/\t/
' yourfile

Resultados:

Apattern1   somethinghere       Line-of-data-here-aaa
Apattern1   somethinghere       Line-of-data-here-xxxxx
ApatternX   somethinghere       Line-of-data-here-bbbb
ApatternX   somethinghere       Line-of-data-here-yyyy
ApatternX   somethinghere       Line-of-data-here-nnnnn

Explicação

  • Selecione o intervalo correto rejeitando o intervalo incorreto: '/ ^ A /, / ^ Z /! d'
  • Armazene os limites de intervalo no espaço de espera.
  • Intercale internamente, anexe a linha atual e alterne + altere \ n para a guia.
por 01.08.2017 / 17:47