Extraia várias linhas com pesquisa de palavra-chave secundária

2

Eu tenho um arquivo de texto com vários dados de registro, gostaria de pesquisar por 'Keyword-1' em uma linha e, quando encontrar a linha, pesquisar nessa linha por outra palavra-chave, como 'engine-1' . Em seguida, extraia a seção do início do 'engine-1' até chegar a um mecanismo diferente, como 'engine-2'. Gostaria que toda a seção 'engine-1' fosse extraída, incluindo todas as linhas entre o início e o final de 'engine-1'. O fim de 'engine-1' é definido alcançando qualquer outro número como 'engine-2' ou 'engine-xx'.

Note que nem todas as linhas contêm a palavra engine, mas eu ainda quero extrair o 'Data' entre 'engine-1' start e 'engine-1' end.

Em seguida, passe para a próxima seção do arquivo e repita o processo pesquisando primeiro a palavra-chave-1 e localizando o mecanismo usado e extraída a seção inicial / final do novo mecanismo diferente. O link entre todas as seções seria "keyword-1"

O arquivo de texto é assim:

 Data engine-1
 Data engine-1
 Data
 Data
 Data engine-1 **keyword-1**
 Data engine-1


 Data engine-2
 Data engine-2
 Data
 Data
 Data engine-2
 Data engine-2

 Data engine-3
 Data engine-3 
 Data
 Data
 Data engine-3 **keyword-1**
 Data engine-3

 Data engine-1
 Data engine-1 
 Data
 Data
 Data engine-1

O resultado deve ficar assim após a extração:

 Data engine-1
 Data engine-1
 Data
 Data
 Data engine-1 **keyword-1**
 Data engine-1

 Data engine-3
 Data engine-3 
 Data
 Data
 Data engine-3 **keyword-1**
 Data engine-3
    
por user3123303 20.12.2013 / 18:06

1 resposta

4

Não tenho certeza se entendi corretamente, pois a descrição do problema não corresponde à saída desejada, mas se as entradas diferentes do arquivo forem separadas por novas linhas consecutivas, você poderá usar o modo Perl e o modo parágrafo:

 $ perl -000ne 'print if /keyword/' file 
 Data engine-1
 Data engine-1
 Data
 Data
 Data engine-1 **keyword-1**
 Data engine-1

 Data engine-3
 Data engine-3 
 Data
 Data
 Data engine-3 **keyword-1**
 Data engine-3

A magia é o -000, isso ativa o modo de parágrafo do Perl, o que faz com que ele divida os arquivos em parágrafos. Em outras palavras, os registros são separados por dois ou mais caracteres \ n consecutivos. Em seguida, informamos para imprimir se o registro atual contiver a palavra-chave.

Você também pode fazer isso em gawk :

$ gawk 'BEGIN{RS=ORS="\n\n"}/keyword/' file

RS é o separador de registro de entrada que definimos como 2 novas linhas consecutivas para analisar corretamente o arquivo. ORS é o separador de registro de saída que também precisa ser configurado para imprimir uma nova linha entre cada registro impresso.

    
por 20.12.2013 / 18:13