私の入力ファイルinput.txtには、次のように2行あります。最初の行から ClaimStartDate を抽出し、2 行目で 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
<ProfessionalClaim
in を含むすべての行を検索text.xml
sed
最初と最後のオニルまで行を切ります。awk
claimStartDate
1行目とClaimEndDate
2行目を印刷します
答え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
ためにも使用できます。claimStartDate
ProfessionalClaim
ProfessionalClaim
ProfessionalClaim
claimEndDate
xmlstarlet select --template \
--match '//ProfessionalClaim[following-sibling::ProfessionalClaim/@claimEndDate]' \
--value-of 'concat(@claimStartDate, " ", following-sibling::ProfessionalClaim/@claimEndDate)' \
-nl input.txt
これは、最初にProfessionalClaim
他のノードが続くすべてのノードと一致しますProfessionalClaim
。
これらの各ノードの属性値は、単一のclaimStartDate
空白文字を区切り文字として使用して、後続のノードの属性値に関連付けられます。claimEndDate
ProfessionalClaim
上記のサンプル文書を見ると、次のような結果が生成されます。
2018-04-02 2018-04-17
2018-04-17 2018-04-18
2018-04-18 2018-04-19