2013-08-06 33 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