2016-07-05 79 views
0

我的輸入XML如下。如果存在「SEARCH」關鍵字,我需要在輸入XML中進行搜索。如果存在,我需要 將<record>的內容複製到</record>並寫入另一個XML文件。awk:在XML中搜索關鍵字並寫入其他文件

輸入XML

<XML> 
<record category="xyz"> 
<person ssn="" e-i="E"> 
<title xsi:nil="true"/> 
<position xsi:nil="true"/> 
<details> 
<names> 
<first_name/> 
<last_name></last_name> 
</names> 
<aliases> 
<alias>CDP</alias> 
</aliases> 
<keywords> 
<keyword xsi:nil="true"/> 
<keyword>SEARCH</keyword> 
</keywords> 
<external_sources> 
<uri>http://www.google.com</uri> 
<detail>SEARCH is present in abc for xyz reason</detail> 
</external_sources> 
</details> 
</person> 
</record> 
<record category="abc"> 
<person ssn="" e-i="F"> 
<title xsi:nil="true"/> 
<position xsi:nil="true"/> 
<details> 
<names> 
<first_name/> 
<last_name></last_name> 
</names> 
<aliases> 
<alias>CDP</alias> 
</aliases> 
<keywords> 
<keyword xsi:nil="true"/> 
<keyword>DONTSEARCH</keyword> 
</keywords> 
<external_sources> 
<uri>http://www.google.com</uri> 
<detail>SEARCH is not present in abc for xyz reason</detail> 
</external_sources> 
</details> 
</person> 
</record> 
</XML> 

我的本次代碼:與當前代碼

NR==FNR { 
keywordArray[NR]=$0; 
next; 
} 

/<record/{ i=1 } 
i { a[i++]=$0 } 
/<\/record>/ { 
    if (found) { 
     for (i=1; i<=length(a); ++i) print a[i] >> output.xml 
    } 
    i=0; 
    found=0 
} 
$0 ~ "<keyword>"SEARCH"</keyword>" { found=1 } 

問題:

代碼不搜索 「搜索」,它不寫任何東西到output.xml

預期輸出:

<record category="xyz"> 
<person ssn="" e-i="E"> 
<title xsi:nil="true"/> 
<position xsi:nil="true"/> 
<details> 
<names> 
<first_name/> 
<last_name></last_name> 
</names> 
<aliases> 
<alias>CDP</alias> 
</aliases> 
<keywords> 
<keyword xsi:nil="true"/> 
<keyword>SEARCH</keyword> 
</keywords> 
<external_sources> 
<uri>http://www.google.com</uri> 
<detail>SEARCH is present in abc for xyz reason</detail> 
</external_sources> 
</details> 
</person> 
</record> 
+3

股票建議:不要使用像awk這樣的面向行的工具來操作XML數據。改爲使用支持XML的工具,如「xsltproc」和「xmlstarlet」。 –

+0

ie xmlstarlet sel -t -m'XML/record/person/details/keywords/keyword [。=「SEARCH」]'-c'../../../...'foo.xml> bar.xml – tomc

+0

@tomc:爲什麼在上面的代碼中需要''../../../ ..''? – user2488578

回答

1

好吧,它不是完美的,但也許你可以改善這一點:

BEGIN { 
    FS="\n"  # field separator to enter 
    OFS="\n"  # output separator as well 
    RS="</record>" # records end at </record> 
} 
$0 ~ /<keyword>SEARCH<\/keyword>/'  # print record if SEARCH matched 
1

隨着xmlstarlet,你可以這樣做:

xmlstarlet sel -t -c "//record[.//keyword/text()='SEARCH']" foo.xml 
+0

@ user2488578 @Michael Vehrs指出我的(故意明確的)版本中的'../../../ ..'是'-c'opy上面四個父母的xml節,其中「SEARCH」是'-m '出動。 – tomc