2013-08-06 34 views
-1

我編寫了一個awk/shell腳本來處理輸入xml文件並輸出具有所需元素的另一個xml文件。雖然這個腳本可以工作,但我想簡化它,以便我不使用任何臨時文件,而是在命令之間傳輸輸出。 這是腳本。按順序鏈接多個awk命令和shell腳本

#extract elements 
awk 'BEGIN {FS="[<|>]"} /(elementname).*$/{matchingstring=$0} 
{ printf "%s\n", matchingstring}' input.xml > tmp.xml 

#sort, uniq, append closing tag (/>) 
for i in `cat tmp.xml | awk '{print $2}' |sort | uniq `; do grep -m 1 $i tmp.xml; 
done | sort -r | sed "s/>$/\/>/" > tmp2.xml 

# Append xml header and root element 
awk 'BEGIN { 
FS="[<|>]"} 
NR==1{ 
    print "<?xml version=\"1\.0\" encoding=\"UTF\-8\"?>" 
    print "<listofelements>" 
}; 
{ printf "%s\n", $0 } 
END { print "</listifelements>";}' tmp2.xml > final.xml 

任何輸入將不勝感激。

+2

這將是有益的,如果你給任何樣本輸入和輸出,並expalin你在「#sort,uniq,附加結束標記(/>)打算做什麼」 – Vijay

+0

在排序,uniq部分,我簡單地排序通過xml元素名稱,並獲取元素的唯一列表,因爲提取後有多個重複項。下面是第一步輸入後的示例 - – Afs

+0

等等。我需要通過propa來獲得一組獨特的元素。 (這是關鍵,其他屬性不需要檢查唯一性)。對不起,格式。不知道如何格式化本節中的代碼。 – Afs

回答

0

其中一項改善將是:

awk 'BEGIN {FS="[<|>]"} /(elementname).*$/{matchingstring=$0} 
{ printf "%s\n", matchingstring}' input.xml > tmp.xml 

可以替換爲:

awk '/(elementname).*$/' input.xml > tmp.xml 

而且也是這個如下:

awk 'BEGIN { 
FS="[<|>]"} 
NR==1{ 
    print "<?xml version=\"1\.0\" encoding=\"UTF\-8\"?>" 
    print "<listofelements>" 
}; 
{ printf "%s\n", $0 } 
END { print "</listifelements>";}' tmp2.xml > final.xml 

可改爲:

awk 'BEGIN { 
print "<?xml version=\"1\.0\" encoding=\"UTF\-8\"?>"; 
print "<listofelements>"} 
END {print "</listifelements>";}1' tmp2.xml > final.xml 
+0

與'grep elementname input.xml'有什麼不同? – tripleee

+0

第一個,它沒有什麼不同。第二個是不同的,它會在文件中添加一個頭文件和尾部文件 – Vijay

+0

謝謝,這簡單得多。無論如何,我可以避免使用臨時文件,並在這些之間使用管道? – Afs