我需要按名称而不是按位置对XML标签值进行排序,因为XML标签是动态的,即标签的数量不是固定的。到目前为止,我已经尝试了下面的代码,但它未能给予预期的输出。
$ sed -e 's/<timestamp>/& /' file | sort -n -k2 | sed 's/ //g'
XML记录:-
<data1><Version>101</Version><timestamp>2022-11-01T05:51:33.540</timestamp><newtag>xlc<newtag><name>XXX</name></data1>
<data1><Version>102</Version><timestamp>2022-11-01T05:49:32.511</timestamp><newtag>xlc<newtag><name>BBB</name></data1>
<data1><Version>101</Version><timestamp>2022-11-01T05:54:30.540</timestamp><name>AAA</name></data1>
<data2><Version>102</Version><timestamp>2022-11-01T05:50:33.540</timestamp><newtag>xlc<newtag><name>XXX</name></data2>
<data2><Version>101</Version><timestamp>2022-11-01T05:41:33.540</timestamp><name>YYY</name></data2>
<data2><Version>102</Version><newtag>xlc<newtag><timestamp>2022-11-01T05:50:12.510</timestamp><name>BBB</name></data2>
预期输出:-
<data2><Version>101</Version><timestamp>2022-11-01T05:41:33.540</timestamp><name>YYY</name></data2>
<data1><Version>102</Version><timestamp>2022-11-01T05:49:32.511</timestamp><newtag>xlc<newtag><name>BBB</name></data1>
<data2><Version>102</Version><newtag>xlc<newtag><timestamp>2022-11-01T05:50:12.510</timestamp><name>BBB</name></data2>
<data2><Version>102</Version><timestamp>2022-11-01T05:50:33.540</timestamp><newtag>xlc<newtag><name>XXX</name></data2>
<data1><Version>101</Version><timestamp>2022-11-01T05:51:33.540</timestamp><newtag>xlc<newtag><name>XXX</name></data1>
<data1><Version>101</Version><timestamp>2022-11-01T05:54:30.540</timestamp><name>AAA</name></data1>
2条答案
按热度按时间vulvrdjw1#
使用
awk
拆分<[/]?timestamp>
处的字段,使用时间戳作为键填充数组,然后对其进行排序。这假定记录在一行中。gawk 'BEGIN{FS="<[/]?timestamp>"}{ts[$2]=$1 "<timestamp>" $2 "</timestamp>" $3}END{ n=asorti(ts,kts); for (i=1;i<=n;i++){ print ts[kts[i]]}}' tmp.xml
测试结果
3zwjbxry2#
如果从sort中删除
-n
开关,则代码可以正常工作: