按顺序链接多个awk命令和shell脚本

时间:2013-08-06 06:55:34

标签: shell awk

我编写了一个awk / shell脚本来处理输入xml文件并输出另一个带有所需元素的xml文件。虽然这个脚本工作,我想简化它,以便我不使用任何临时文件,而是在命令之间管道输出。 这是剧本。

#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 

非常感谢任何投入。

1 个答案:

答案 0 :(得分: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