Extraia a string seguida por uma palavra/símbolo específico

Extraia a string seguida por uma palavra/símbolo específico

Tenho duas linhas conforme mostrado abaixo em meu arquivo de entrada input.txt e preciso extrair ClaimStartDate da primeira linha e ClaimEndDate da segunda linha.

<ProfessionalClaim paymentIndicator="P" claimProcessedDateTime="20180409120000102" claimEndDate="2018-04-02" claimStartDate="2018-04-02" sourceSystemId="abcd" claimActionCode="00">

<ProfessionalClaim paymentIndicator="P" claimProcessedDateTime="20180430120000281" claimEndDate="2018-04-17" claimStartDate="2018-04-17" sourceSystemId="abcd" claimActionCode="00">

rm input.txt
awk '/<ProfessionalClaim/' test.xml | head -1 > input.txt
awk '/<ProfessionalClaim/' test.xml | tail -1 >> input.txt
awk '{match($0, "claimStartDate=\"([^\"]+)\"", start); print start[1]} \
     {match($0, "claimEndDate=\"([^\"]+)\"", end); print end[1]}' input.txt

Responder1

$ awk '/F_LINE/ {match($0, "claimStartDate=\"([^\"]+)\"", start); print start[1]} \         
       /L_LINE/ {match($0, "claimEndDate=\"([^\"]+)\"", end); print end[1]}' input.txt
2018-04-02
2018-04-17

EDITAR devido às suas novas informações:

$ awk 'NR==1 {match($0, "claimStartDate=\"([^\"]+)\"", start); print start[1]} \            
       NR==2 {match($0, "claimEndDate=\"([^\"]+)\"", end); print end[1]}' input.txt
2018-04-02
2018-04-17

Você também pode fazer tudo isso de uma só vez:

$ grep "<ProfessionalClaim" text.xml \
| sed -n '1p;$p' \
| $ awk 'NR==1 {match($0, "claimStartDate=\"([^\"]+)\"", start); print start[1]} \            
         NR==2 {match($0, "claimEndDate=\"([^\"]+)\"", end); print end[1]}'
  • grepencontre todas as linhas com <ProfessionalClaimemtext.xml
  • sedtruncar as linhas para o primeiro e o último onyl
  • awkirá imprimir o claimStartDatepara a primeira linha e ClaimEndDatepara a segunda linha

Responder2

Supondo algum documento de entrada XML como o seguinte:

<?xml version="1.0"?>
<root>
  <ProfessionalClaim paymentIndicator="P" claimProcessedDateTime="20180409120000102" claimEndDate="2018-04-02" claimStartDate="2018-04-02" sourceSystemId="abcd" claimActionCode="00"/>
  <ProfessionalClaim paymentIndicator="P" claimProcessedDateTime="20180430120000281" claimEndDate="2018-04-17" claimStartDate="2018-04-17" sourceSystemId="abcd" claimActionCode="00"/>
  <ProfessionalClaim paymentIndicator="P" claimProcessedDateTime="20180430120000281" claimEndDate="2018-04-18" claimStartDate="2018-04-18" sourceSystemId="abcd" claimActionCode="00"/>
  <ProfessionalClaim paymentIndicator="P" claimProcessedDateTime="20180430120000281" claimEndDate="2018-04-19" claimStartDate="2018-04-19" sourceSystemId="abcd" claimActionCode="00"/>
</root>

... podemos usar xmlstarletpara extrair o claimStartDatevalor do atributo de cada ProfessionalClaimnó que possui outro ProfessionalClaimnó o seguindo, junto com o valor do atributo ProfessionalClaimdo próximo nó :claimEndDate

xmlstarlet select --template \
    --match '//ProfessionalClaim[following-sibling::ProfessionalClaim/@claimEndDate]' \
    --value-of 'concat(@claimStartDate, " ", following-sibling::ProfessionalClaim/@claimEndDate)' \
    -nl input.txt

Isso primeiro corresponde a cada ProfessionalClaimnó seguido por outro ProfessionalClaimnó.

Para cada nó, o valor do claimStartDateatributo é concatenado com o valor do claimEndDateatributo do ProfessionalClaimnó seguinte, com um único caractere de espaço como delimitador.

Dado o meu documento de exemplo acima, isso geraria

2018-04-02 2018-04-17
2018-04-17 2018-04-18
2018-04-18 2018-04-19

informação relacionada