Desejo obter as linhas que, na ordem inversa, correspondem da linha correspondente do padrão A à primeira ocorrência da linha correspondente do padrão B junto com as linhas pelas quais ela passa.
ATUALIZADA:example_file.txt
ISA*00* *00* *ZZ*SIX-SIX6 *12*666666666666 *66666666*6666*U*666666666*6666666666*0*P*\
GS*FA*SIX-SIX-SIX*666666666*6666666*6666*6666*X*66666
ST*666*666
AK1*SX*666
AK2*777*6666666
AK5*A
AK2*777*7777777
AK3*S6*5**3
AK3*A2*5**3
AK4*3*6969*4
AK4*7*6969*4
AK5*R*5
AK2*777*6666666
AK5*A
AK2*777*69696969
AK3*J7*5**3
AK4*3*6969*4
AK5*R*5
AK9*P*20*20*19
SE*69*6969
GE*1*6767
IEA*1*0000000000
O que eu quero é pegar, de baixo para cima, todo o AK5
padrão com R
depois dele, assim:
Padrão A :AK5*R
e obtenha todas as linhas subindo até que a primeira ocorrência do padrão B seja correspondida. por exemplo:
Padrão B :AK2
Saída desejada :
O primeiro padrão A encontrado será chamado de E1
AK2*777*7777777
AK3*S6*5**3
AK3*A2*5**3
AK4*3*6969*4
AK4*7*6969*4
AK5*R*5
ATUALIZADO: O segundo padrão A correspondente será chamado de E2
AK2*777*69696969
AK3*J7*5**3
AK4*3*6969*4
AK5*R*5
e assim por diante se houver mais de 1 padrão A correspondido.
EDIT: Eu sei sed
que posso fazer isso, mas ainda não tenho sorte em obter a linha de cada padrão A correspondente à sua primeira ocorrência do padrão B correspondente e armazená-los em um arquivo de texto temporário para processamento posterior.
Este é o meu sed
comando de exemplo que obtém todo o padrão B disponível noexample_file.txt
sed -ne '/AK2\*/,/\AK5\*R/p' example_file.txt
Exemplo de cenário lógico de comando:
A="AK5\*R"
B="AK2"
find the first $A < example_file.txt; # AK5\*R
move to previous line until first occurrence of $B line; # AK2*any_number*any_number
get all lines from first $A to its first occurrence of $B and store in a text file; # result > e1.txt
# The same way goes to the second occurrence of pattern A.
(NOTA: Primeira ocorrência do significado $B, começando de cada linha $A, obtenha a linha $A e as linhas anteriores até a primeira linha correspondente $B que encontrar. Então, por exemplo, se a primeira linha $A começar na linha do meio de um arquivo como na linha número 50, se o arquivo tiver 100 linhas no total, a partir daí, mova para a linha anterior até que o comando encontre a primeira linha $ B que ele vê.) Veja o exemplo abaixo.
exemplo_arquivo2.txt
ISA*00* *00* *ZZ*SIX-SIX6 *12*666666666666 *66666666*6666*U*666666666*6666666666*0*P*\
GS*FA*SIX-SIX-SIX*666666666*6666666*6666*6666*X*66666
ST*666*666
AK1*SX*666
AK2*777*6666666
AK5*A
AK2*777*7777777
AK5*A
AK2*777*888888
AK5*A
AK2*777*7777777
AK5*A
AK2*777*5555555
AK5*A
AK2*777*7777777
AK5*A
AK2*777*4545435
AK5*A
AK2*777*7777777
AK5*A
AK2*777*7777777
AK3*S6*5**3
AK3*A2*5**3
AK4*3*6969*4
AK4*7*6969*4
AK5*A
AK2*777*0987654
AK3*S6*5**3
AK3*A2*5**3
AK4*3*6969*4
AK4*7*6969*4
AK5*R*5
AK2*777*7777777
AK3*S6*5**3
AK3*A2*5**3
AK4*3*6969*4
AK4*7*6969*4
AK5*A
AK2*777*7777777
AK3*S6*5**3
AK3*A2*5**3
AK4*3*6969*4
AK4*7*6969*4
AK5*A
Resultado:
AK2*777*0987654
AK3*S6*5**3
AK3*A2*5**3
AK4*3*6969*4
AK4*7*6969*4
AK5*R*5
Lendo novamente sua descrição, entendo que você deseja a primeira correspondência do padrão B de baixo para cima até (subindo) a primeira correspondência do padrão A. Mas as seções resultantes devem estar na ordem que o arquivo possui.
Isso requer muita lógica. O script de shell a seguir faz tudo. Colocará os resultados na ordem interna correta em arquivos
E
e algum número, o primeiro arquivo (E1
) terá a primeira correspondência do topo, o último arquivo terá a última seção correspondente.Os intervalos resultantes serão:
POSIX
ex
para o resgate novamente!ex
é o editor de arquivo programável especificado pelo POSIX. Para qualquer coisa que envolva endereçamento reverso, geralmente é uma solução muito melhor do que Awk ou Sed.O seguinte one-liner funciona perfeitamente no seu
example_file2.txt
:No seu
example_file.txt
, também funciona, mas como og
comando lobal inex
não pode gravar em um destino separado para cada intervalo acionado, os dois arquivos de saída desejados são mesclados da seguinte forma:No entanto, isso é bastante fácil de lidar - com outra ferramenta POSIX,
csplit
, projetada para dividir arquivos de acordo com um "contexto".Solução POSIX portátil:
Há um elemento final para tornar essa solução perfeita, que é renumerar os arquivos na ordem inversa. Eu não fiz esta parte.
Se você não se importa com a numeração do arquivo na mesma ordem do arquivo, e se você não se importa se a extensão
.txt
for omitida, e se você não se importa se os arquivos são numerados dee01
em vez dee1
, e se você não se importar com a impressão de uma mensagem de diagnóstico sobre quantas linhas foram colocadas em cada arquivo, podemos simplificar: