Grep da última ocorrência de um padrão para outro padrão

0

Bom dia,

Estou tentando escrever um script UNIX para um arquivo com vários padrões duplicados, seguido pelo padrão que estou procurando. Esta questão é muito semelhante a:

" Obtenha a última ocorrência de um padrão antes de outro padrão ". No entanto, não tenho 'tac' (ou 'tail -r') e estou procurando retornar a última ocorrência de String1 antes de String2 e String2 também.

output.out:

...
Condition 1: A
foo
Condition 1: B
foo
Condition 2: C
foo
Condition 1: D
foo
Condition 1: E
foo
Condition 2: F
...

Gostaria de escrever um script grep / sed / awk para retornar:

Condition 1: B
Condition 2: C
Condition 1: E
Condition 2: F

Como a Condição 1 é sempre as linhas 'x' acima da Condição 2, tentei usar:

grep -B x "Condition 2"

E a partir daí, mas por algum motivo, a segunda ocorrência na saída do script resultante interrompe algumas linhas a partir do topo (portanto, não exibindo a Condição 1), devido a linhas em branco entre a Condição 1/2 talvez. Não tenho certeza o motivo. Então eu abandonei usando grep -B. Eu acho que tac ajudaria como eu poderia grep 'para trás', mas eu não tenho o comando tac (ou cauda-r) no meu ambiente.

Estava querendo saber se alguém tinha algum conselho, seria muito apreciado. Obrigado pelo seu tempo e ajuda com antecedência.

    
por Henry 20.12.2016 / 21:39

2 respostas

2

Bem, se grep não funcionar corretamente, não é certo se awk faz isso, mas você pode tentar isso:

awk '/Condition 1/ { acc = $0; } /Condition 2/ { print acc; print; }' input
    
por 21.12.2016 / 12:22
1

Um uso mais genérico baseado na condição alternativa (nem sempre no ciclo 2-1). Lembre-se da última condição e compare se ela muda ou não e imprima a última linha de condição se ela mudar, se não lembrar. Também imprima o último lembrete na saída e inicie o ciclo de recordação com a primeira condição ocorrendo.

awk -F '[[:blank:]:]*'
   /^Condition/ { 

      if (Index == $2) Last = $0
       else if (Index ~ /^$/) Index = $2; Last = $0
             elseprint Last
      Index = $2
      }
   END { print Last }
   ' YourFile
    
por 22.12.2016 / 08:22