Unix를 통해 XML 파일에 주석 태그 추가

Unix를 통해 XML 파일에 주석 태그 추가

입력 XML 파일:

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<Dcn xmlns="http://schemas.test.com/2013/ClaimRequest" xsi:schemaLocation="http://schemas.test.com/2013/ClaimRequest gdhjf/profiles/Redirect/dhd/Desktop/dhd_Prof.XSD" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Header sendingSystemId="XYC" receivingSystemId="ABC" version="2.0" createDateTime="2019-01-19T04:27:15" batchingControlNumber="AZ042018" transType="ClaimRequest" dcn="1901959351"/>
  <Body>
    <ClaimRequest>
      <Claims>
        <ProfessionalClaim paymentIndicator="P" claimProcessedDateTime="20180409120000102" claimEndDate="2018-04-02" claimStartDate="2018-04-02" sourceSystemId="abcd" claimActionCode="00">
          <PayToProvider id="54321"/>
          <Patient eligSysId="dhhgs1" clientId="VBV"/>
          <ClaimLines>
            <ClaimLine sourceSystemClaimLineNumber="1" />
            <ClaimLine sourceSystemClaimLineNumber="2" />
            <ClaimLine sourceSystemClaimLineNumber="3" />
          </ClaimLines>
          <ClaimTrailer claimDetailLineCount="3"/>
        </ProfessionalClaim>
         <ProfessionalClaim paymentIndicator="P" claimProcessedDateTime="20180430120000277" claimEndDate="2018-04-12" claimStartDate="2018-04-12" sourceSystemId="abcd" claimActionCode="00">
          <PayToProvider id="54673"/>
          <Patient eligSysId="dhhgs1" clientId="VBV"/>
          <ClaimLines>
            <ClaimLine sourceSystemClaimLineNumber="1" />
          </ClaimLines>
          <ClaimTrailer claimDetailLineCount="1"/>
        </ProfessionalClaim>
        <ProfessionalClaim paymentIndicator="P" claimProcessedDateTime="20180430120000279" claimEndDate="2018-04-17" claimStartDate="2018-04-17" sourceSystemId="abcd" claimActionCode="00">
          <PayToProvider id="676543"/>
          <Patient lastName="CLARK" memberId="U1672936601" firstName="DANIEL" eligSysId="CNCIEDW1" clientId="CNC"/>
          <ClaimLines>
            <ClaimLine  sourceSystemClaimLineNumber="1" />
            <ClaimLine  sourceSystemClaimLineNumber="2" />
          </ClaimLines>
          <ClaimTrailer claimDetailLineCount="2"/>
        </ProfessionalClaim>
        <ProfessionalClaim paymentIndicator="P" claimProcessedDateTime="20180430120000281" claimEndDate="2018-04-17" claimStartDate="2018-04-17" sourceSystemId="abcd" claimActionCode="00">
          <PayToProvider id="653473"/>
          <Patient lastName="VAUGHN" memberId="U1677077501" firstName="KAREN" eligSysId="CNCIEDW1" clientId="CNC"/>
          <ClaimLines>
            <ClaimLine sourceSystemClaimLineNumber="1"/>
            <ClaimLine sourceSystemClaimLineNumber="2"/>
          </ClaimLines>
          <ClaimTrailer claimDetailLineCount="2"/>
        </ProfessionalClaim>
      </Claims>
      <IcnCount total="4"/>
    </ClaimRequest>
  </Body>
</Dcn>

이 XML 파일의 헤더 태그 앞에 주석 태그를 추가하고 다음 세부 정보를 채워야 합니다.

<!-- Claims Paid_Start_Date="2018-04-02" Paid_End_Date="2018-04-17" Process_Start_Date="20180409" Process_End_Date="201804301" -->

여기,

  • Claim_Start_Date= 파일에 있는 ClaimStartDate의 최소값입니다.
  • Claim_End_Date= 파일 내 ClaimEndDate의 최대값
  • Process_Start_Date= 파일의 첫 번째 청구processedDateTime
  • Process_End_Date= 파일의 마지막 청구ProcessedDateTime

지금까지 내가 한 일은 다음과 같습니다.

F_LINE=awk '/<professionalclaim/' test.xml | head -1

L_LINE=awk '/<professionalclaim/' test.xml | tail -1

이제 이 두 행에서 필요한 값을 추출하여 주석 태그에 채워야 합니다.

답변1

XML 파서를 사용하면 이렇게 필요한 구성요소를 한 번에 하나씩 추출할 수 있습니다. 귀하의 파일은 x.xml.

# Parse the XML file for the relevant entries
#
minClaimStartDate=$(xmlstarlet sel -t -v '//_:ProfessionalClaim/@claimStartDate' -n x.xml | sort -V | head -n1)
maxClaimEndDate=$(xmlstarlet sel -t -v '//_:ProfessionalClaim/@claimStartDate' -n x.xml | sort -V | tail -n1)
...

# Grab the XML declaration header
#
header=$(head -n1 x.xml)    # Ugh, I can't find a way to do this properly

그러면 조각들을 이렇게 다시 합칠 수 있어요

# Output composite
#
echo "$header"
echo "<!-- Claims Paid_Start_Date="$minClaimStartDate" Paid_End_Date="$maxClaimEndDate" ... -->"
xmlstarlet fo --omit-decl x.xml

관련 정보