如何在UNIX中对xml文件进行排序

时间:2014-10-21 10:09:44

标签: xml sorting unix

我们有XML文件,(日期:DD / MM / YY)

<ABT><pid>101</pid><date>10/12/13</date><name>AAA</name></ABT>
<ABT><pid>102</pid><date>11/12/13</date><name>BBB</name></ABT>
<ABT><pid>101</pid><date>09/12/13</date><name>AAA</name></ABT>
<ABT><pid>102</pid><date>24/12/13</date><name>BBB</name></ABT>
<JRE><pid>101</pid><date>01/12/13</date><name>AAA</name></JRE> 
<JRE><pid>102</pid><date>02/12/13</date><name>BBB</name></JRE>

输出应为

<JRE><pid>101</pid><date>01/12/13</date><name>AAA</name></JRE>
<ABT><pid>101</pid><date>09/12/13</date><name>AAA</name></ABT>
<ABT><pid>101</pid><date>10/12/13</date><name>AAA</name></ABT>
<JRE><pid>102</pid><date>02/12/13</date><name>BBB</name></JRE>
<ABT><pid>102</pid><date>11/12/13</date><name>BBB</name></ABT>
<ABT><pid>102</pid><date>24/12/13</date><name>BBB</name></ABT>

如何根据<pid>, <date>对此文件进行排序。

2 个答案:

答案 0 :(得分:1)

我会将sortsed一起使用。如果您首先要根据pid然后在date进行订购,请在每个代码之后添加一个空格,然后进行相应的排序:

$ sed -e 's/<pid>/& /' -e 's/<date>/& /' file | sort -nk2 -k3 | sed 's/ //g'
<JRE><pid>101</pid><date>01/12/13</date><name>AAA</name></JRE>
<ABT><pid>101</pid><date>09/12/13</date><name>AAA</name></ABT>
<ABT><pid>101</pid><date>10/12/13</date><name>AAA</name></ABT>
<JRE><pid>102</pid><date>02/12/13</date><name>BBB</name></JRE>
<ABT><pid>102</pid><date>11/12/13</date><name>BBB</name></ABT>
<ABT><pid>102</pid><date>24/12/13</date><name>BBB</name></ABT>

首先sed在日期之前添加一个空格,最后一个删除它。在这两者之间,sort -n -k2 -k3按数字排序(-n),首先基于第2列(-k2),然后基于第3列(-k3)。

答案 1 :(得分:0)

使用xidel

进行排序

此命令将使用xidel根据file.xmlpid对名为date的文件进行排序。

xidel --xquery 'for $i in doc("file.xml")/* order by $i/pid, $i, $i/date return $i' --output-format xml

考虑根节点

  

你总是需要一个根元素。

Link to the topic

因此,将根节点添加到输入:

<root>
    <ABT>
        <pid>101</pid>
        <date>10/12/13</date>
        <name>AAA</name>
    </ABT>
    <ABT>
        <pid>102</pid>
        <date>11/12/13</date>
        <name>BBB</name>
    </ABT>
    <ABT>
        <pid>101</pid>
        <date>09/12/13</date>
        <name>AAA</name>
    </ABT>
    <ABT>
        <pid>102</pid>
        <date>24/12/13</date>
        <name>BBB</name>
    </ABT>
    <JRE>
        <pid>101</pid>
        <date>01/12/13</date>
        <name>AAA</name>
    </JRE> 
    <JRE>
        <pid>102</pid>
        <date>02/12/13</date>
        <name>BBB</name>
    </JRE>
</root>

注意:无论如何,xidel可以处理这种多根结构。

如果根节点的直接子节点的所有节点都将<pid><date>作为子节点

您的输入XML文件名为file.xml

此命令将使用xidel根据名称为<pid><date>的子项进行排序后返回顶级节点。

xidel --xquery '<root>
                {for $i in doc("file.xml")/*/*
                order by $i/pid, $i, $i/date
                return $i}
                </root>' --output-format xml

命令在一行中:

xidel --xquery '<root>{for $i in doc("file.xml")/*/* order by $i/pid, $i, $i/date return $i}</root>' --output-format xml