我们有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>
对此文件进行排序。
答案 0 :(得分:1)
我会将sort
与sed
一起使用。如果您首先要根据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根据file.xml
和pid
对名为date
的文件进行排序。
xidel --xquery 'for $i in doc("file.xml")/* order by $i/pid, $i, $i/date return $i' --output-format xml
你总是需要一个根元素。
因此,将根节点添加到输入:
<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