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
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.
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