문자열과 특정 단어/기호를 추출합니다.

문자열과 특정 단어/기호를 추출합니다.

내 입력 파일 input.txt에는 아래와 같이 두 줄이 있습니다. 첫 번째 줄에서 ClaimStartDate를 추출하고 두 번째 줄에서 ClaimEndDate를 추출해야 합니다.

<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

답변1

$ 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

새로운 정보로 편집되었습니다:

$ 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

한 번에 모든 작업을 수행할 수도 있습니다.

$ 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]}'
  • grep<ProfessionalClaimin을 포함하는 모든 줄 찾기text.xml
  • sed첫 번째와 마지막 onyl까지 줄을 자릅니다.
  • awkclaimStartDate첫 번째와 ClaimEndDate두 번째 줄을 인쇄합니다

답변2

일부 XML 입력 문서가 다음과 같다고 가정해 보겠습니다.

<?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>

... 다음 노드의 속성 값뿐만 아니라 다른 노드가 뒤따르는 각 노드에서 속성 값을 xmlstarlet추출하는 데 사용할 수 있습니다.claimStartDateProfessionalClaimProfessionalClaimProfessionalClaimclaimEndDate

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

이는 먼저 ProfessionalClaim다른 노드가 뒤따르는 모든 노드와 일치합니다 ProfessionalClaim.

이러한 각 노드에 대해 속성 값은 claimStartDate단일 공백 ​​문자를 구분 기호로 사용하여 후속 노드의 속성 값과 연결됩니다.claimEndDateProfessionalClaim

위의 예제 문서를 보면 다음과 같은 결과가 생성됩니다.

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

관련 정보