grep vários padrões com contexto diferente

0

Eu tenho um arquivo mais ou menos como

header_one
param1
param2
...

data_one
data1
data2
data3
data4
...

header_two
param1
param2
...

data_two
data1
data2
data3
data4

Gostaria de extrair todos os header blocos com N seguindo as linhas e todos data blocos com M != N seguindo as linhas, mantendo a ordem em que aparecem no arquivo e descartando todo o resto.

Se M == N == 8 eu pudesse, por exemplo fazer

grep -A8 -E "header_|data_"

Mas e se eu quiser ter um contexto diferente para cada padrão?

    
por filippo 19.06.2018 / 09:43

2 respostas

1

Uma solução ad-hoc com o awk poderia ser algo assim:

awk '/^header_/ {n=1+1} /^data_/ {n=1+2} n-- > 0; n == 0 {print "---"}' < file

n é definido em linhas correspondentes e é decrementado para cada linha. As linhas são impressas quando n é positivo com um separador após cada bloco. Com os valores acima, seria impressa header_ linhas mais uma próxima linha e data_ linhas mais duas próximas linhas.

Se os blocos de contexto puderem se sobrepor, o novo valor de n substituirá o valor anterior. Para evitar isso, adicione condições para proteger as atribuições:

awk '/^header_/ {if (n < 2) n=2} 
     /^data_/   {if (n < 5) n=5}
     n-- > 0; n == 0 {print "---"}' < file

Isso deve ser melhor para lidar com casos em que há data_ e header_ em linhas consecutivas.

    
por 19.06.2018 / 09:56
1

Eu tentei com o comando abaixo sed Como testado funcionou bem, deixe-me saber para quaisquer confusões

sed -n -e  '/header_/,+1p' -e '/^data_/,+2p' filename

saída

header_one
param1
data_one
data1
data2
header_two
param1
data_two
data1
data2
    
por 19.06.2018 / 11:09