shell 如何在unix中基于timestamp标记对XML记录进行排序?

idfiyjo8  于 2022-11-16  发布在  Shell
关注(0)|答案(2)|浏览(119)

我需要按名称而不是按位置对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>
vulvrdjw

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
测试结果

<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>
3zwjbxry

3zwjbxry2#

如果从sort中删除-n开关,则代码可以正常工作:

sed  -e 's/<timestamp>/& /' file | sort -k2 | sed 's/ //g'

相关问题