You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Unix系统中基于timestamp标签对动态XML记录排序?

按XML标签名称(而非位置)排序XML记录

我需要按<timestamp>标签的值对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>

解决方案

你原来的sed方法失效的原因是:它依赖<timestamp>标签在每行的固定位置,一旦标签位置变动(比如最后一条记录里<timestamp>在<newtag>之后),sort -k2就抓不到正确的时间戳,排序自然出错。

改用awk提取时间戳作为排序键,就能摆脱位置限制:

awk 'match($0, /<timestamp>([^<]+)<\/timestamp>/, t) {print t[1] "\t" $0}' file | sort | cut -f2-

命令解释

  • match($0, /<timestamp>([^<]+)<\/timestamp>/, t):匹配每行里的<timestamp>标签,把标签内的时间字符串存入数组t的t[1]字段。
  • print t[1] "\t" $0:把时间戳和原始XML行用制表符分隔,输出成新行(时间戳在前,作为排序依据)。
  • sort:直接按时间戳字符串排序——ISO格式的时间字符串字典序和时间顺序完全一致,不用额外参数。
  • cut -f2-:去掉行首的时间戳键,保留原始XML内容。

运行这条命令就能得到你要的预期输出。

内容的提问来源于stack exchange,提问作者Sakshi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 02:10:57