selecionando uma string de um registro em um arquivo

1

Eu tenho um arquivo contendo registros. O formato do registro é o seguinte:

Record: XXXXXX [
{variable number of lines and content}
]

Em algum ponto do registro, pode haver uma string que comece com

Start to do this thing

Gostaria de extrair o número do Registro e a linha no registro que corresponde à palavra "Iniciar"

Atualmente estou usando

egrep "Record|Start" inputfile.txt >> outputfile.txt

mas devo remover manualmente as linhas Record correspondentes às quais não correspondeu Start . Idealmente, gostaria que isso fosse feito em uma única etapa. Eu gostaria de receber sugestões.

    
por Awk-Ward Admin 27.09.2017 / 16:12

2 respostas

1

Usando seu arquivo de exemplo, repetido três vezes seguidas com modificações:

Record: XXXXXX [
{variable number of lines and content}
Start to do this thing
]
Record: YYYYYY [
{variable number of lines and content}
Stop doing this thing
]
Record: ZZZZZZ [
{variable number of lines and content}
Start again
]

Então:

$ awk '/^Record:/ { r = $2 } /^Start/ { print r ":", $0 }' file
XXXXXX: Start to do this thing
ZZZZZZ: Start again

Simplesmente selecionamos o número / rótulo do registro assim que vemos uma linha começando com Record: e a salvamos na variável r . Então, quando encontrarmos uma linha que começa com Start , imprimimos qualquer selo que tenhamos encontrado e a linha.

Se a linha não iniciar com Start , talvez seja necessário alterar a expressão regular de /^Start/ para /^ *Start/ , o que permitirá qualquer número de espaços entre a palavra e o início da linha.

Isso falhará se houver outras coisas no arquivo entre os registros que correspondem a Start .

    
por 27.09.2017 / 16:58
2
Solução

Awk :

Amostra input.txt file:

Record: 111111 [
text
test
Start to do this thing
text
]
Record: 222222 [
{variable number of lines and content}
]
Record: 333333 [
text
text
text
Start to do another thing
text
]

O trabalho:

awk '/^Record: .*\[$/{ f=1; n=$2 }/^\]/{f=0}f && /^Start/{ print n, $0 }' input.txt

A saída:

111111 Start to do this thing
333333 Start to do another thing
    
por 27.09.2017 / 16:26