bashsorting – 我如何使用时间戳sorting

我需要在Linux中使用shellsorting文件。 sorting需要基于每个文件行中包含的时间戳值。 时间戳是不规则的格式,并没有指定前几个月,几天等,所以我正在执行的sorting是不正确的(即他们的格式是“M / D / YYYY H:MI:上午”;所以所以“2012年12月12日12时16分18秒”之前“2012年7月24日12:16:18”,其中之前“2012年7月24日12:17:18”)。

是否有可能根据时间戳进行sorting?

我正在使用以下命令来sorting我的文件:

sort -t= -k3 file.txt -o file.txt.sorted 

(使用等号作为分隔符=> -t= ;使用第三列作为sorting列=> -k3

示例文件如下所示:

 <r id="abcd" t="10/12/2012 12:16:17 AM"><d><nv n="name" v="868" /><nv n="name0" v="73" /><nv n="name1" v="13815004" /></d></r> <r id="defg" t="7/24/2012 12:16:17 PM"><d><nv n="name" v="0" /><nv n="name0" v="0" /><nv n="name1" v="0" /></d></r> <r id="abcd" t="7/24/2012 12:16:17 PM"><d><nv n="name" v="0" /><nv n="name0" v="0" /><nv n="name1" v="0" /></d></r> <r id="zxy" t="7/24/2012 12:16:17 PM"><d><nv n="name" v="0" /><nv n="name0" v="0" /><nv n="name1" v="59542676" /></d></r> <r id="fghj" t="7/24/2012 12:16:17 PM"><d><nv n="name" v="38" /><nv n="name0" v="0" /><nv n="name1" v="3004537" /></d></r> <r id="defg" t="7/24/2012 12:16:18 AM"><d><nv n="name" v="177" /><nv n="name0" v="0" /><nv n="name1" v="5888870" /></d></r> 

linux date命令可以很好地解析这样的日期,并且可以将它们转换成更简单的东西,比如简单的unix-time整数。

例:

 cat file | while read line; do datestring=$(sed -e 's/^.* t="\([^"]*\)".*$/\1/' <<<"$line") echo "$(date -d "$datestring" +%s) $line" done | sort -n 

那么你可以通过适当的cut调用来传递它,如果你想再次移除该unix时间戳的话。

sort是一个很好的工具,但是它没有足够的花里胡哨的手段去分隔伪XML,将一个属性转换成一个合理的时间值,然后排序。

但是,这样的工具确实存在。 尽管最好的方法是使用XSLT转换,但如果文件与您的示例命令期望的一致,那么可以使用cut -d'"' -f4提取时间值,并且可以将每个值以更合理的格式与date 。例如(需要GNU date ):

 paste <(cut -d'"' -f4 file.txt | date -f- +%s) file.txt | sort -n | cut -f2- 

提取日期时间,每行一个; 将它们提供给日期以将它们转换为秒以来的时间; 在每行的开始处粘贴每个时间戳; 用数字排序粘贴的结果,现在用数字时间戳开始,最后删除时间戳以获取原始文件。

测试:

 $ cat >file.txt <<'EOF' <r id="abcd" t="10/12/2012 12:16:17 AM"><d><nv n="name" v="868" /><nv n="name0" v="73" /><nv n="name1" v="13815004" /></d></r> <r id="defg" t="7/24/2012 12:16:17 PM"><d><nv n="name" v="0" /><nv n="name0" v="0" /><nv n="name1" v="0" /></d></r> <r id="abcd" t="7/24/2012 12:16:17 PM"><d><nv n="name" v="0" /><nv n="name0" v="0" /><nv n="name1" v="0" /></d></r> <r id="zxy" t="7/24/2012 12:16:17 PM"><d><nv n="name" v="0" /><nv n="name0" v="0" /><nv n="name1" v="59542676" /></d></r> <r id="fghj" t="7/24/2012 12:16:17 PM"><d><nv n="name" v="38" /><nv n="name0" v="0" /><nv n="name1" v="3004537" /></d></r> <r id="defg" t="7/24/2012 12:16:18 AM"><d><nv n="name" v="177" /><nv n="name0" v="0" /><nv n="name1" v="5888870" /></d></r> EOF $ paste <(cut -d'"' -f4 file.txt | date -f- +%s) file.txt | sort -n | cut -f2- <r id="defg" t="7/24/2012 12:16:18 AM"><d><nv n="name" v="177" /><nv n="name0" v="0" /><nv n="name1" v="5888870" /></d></r> <r id="abcd" t="7/24/2012 12:16:17 PM"><d><nv n="name" v="0" /><nv n="name0" v="0" /><nv n="name1" v="0" /></d></r> <r id="defg" t="7/24/2012 12:16:17 PM"><d><nv n="name" v="0" /><nv n="name0" v="0" /><nv n="name1" v="0" /></d></r> <r id="fghj" t="7/24/2012 12:16:17 PM"><d><nv n="name" v="38" /><nv n="name0" v="0" /><nv n="name1" v="3004537" /></d></r> <r id="zxy" t="7/24/2012 12:16:17 PM"><d><nv n="name" v="0" /><nv n="name0" v="0" /><nv n="name1" v="59542676" /></d></r> <r id="abcd" t="10/12/2012 12:16:17 AM"><d><nv n="name" v="868" /><nv n="name0" v="73" /><nv n="name1" v="13815004" /></d></r>