我需要在Linux中使用希尔排序进行排序的文件。排序需要基于包含于每个文件的行的时间戳值。时间戳是不规则的格式,并没有指定前导零到月,日等,所以我进行种种不正确(即其格式为M / D / YYYY H:MI:•AM,所以所以二零一二年十月十二日下午12时16分18秒来7/24/2012下午12时16分18秒,之前的7/24/2012上午12点17分18秒)的到来之前。
是否有可能进行排序基于时间戳?
我使用下面的命令来排序我的文件:
排序-t = -K3 file.txt的-o file.txt.sorted(使用等号作为分隔符=> -t = ;使用3列作为排序列=> -K3 )
一个样本文件如下:
< R n =ABCDT =二○一二年十月一十二日上午12点16分17秒>< D>< NV N =名字V =868/>< NV N =NAME0v =73/>< NV N =名称1v =13815004/>< / D>< / R>< R ID =DEFGT =7/24/2012下午12时16分17秒>< D>< NV N =名字V =0/>< NV N = NAME0v =0/>< NV N =名称1v =0/>< / D>< / R>< R ID =ABCDT =7/24/2012下午12时16分17秒>< D>< NV N =名字V =0/>< NV N = NAME0v =0/>< NV N =名称1v =0/>< / D>< / R>< R ID =ZXYT =7/24/2012下午12时16分17秒>< D>< NV N =名字V =0/>< NV N = NAME0v =0/>< NV N =名称1v =59542676/>< / D>< / R>< R ID =fghjT =7/24/2012下午12时16分17秒>< D>< NV N =名字V =38/>< NV N = NAME0v =0/>< NV N =名称1v =3004537/>< / D>< / R>< R ID =DEFGT =7/24/2012上午12点16分18秒>< D>< NV N =名字V =177/>< NV N = NAME0v =0/>< NV N =名称1v =5888870/>< / D>< / R>解决方案
而linux 日期命令执行解析日期这样的一个很好的工作,它可以将它们翻译成更可排序的东西,比如简单的UNIX的时间整数。
例如:
猫文件|而读线;做 datestring = $(SED -e的/^.* T =\\([^] * \\)* $ / \\ 1 /。'<<<$线) 回声$(日期-d$ datestring+%S)$线做| -n排序,那么你可以传递通过相应的剪切如果你想知道unix时间戳再次删除调用。
I need to sort a file using shell sort in linux. The sort needs to be based on timestamp values contained within each of file's rows. The timestamps are of irregular format and don’t specify the leading zeros to months, days, etc, so the sorts I am performing are not correct (i.e. their format is "M/D/YYYY H:MI:S AM"; so so "10/12/2012 12:16:18 PM" comes before "7/24/2012 12:16:18 PM", which comes before "7/24/2012 12:17:18 AM").
Is it possible to sort based on timestamps?
I am using the following command to sort my file:
sort -t= -k3 file.txt -o file.txt.sorted(use equal sign as a separator => -t=; use 3rd column as a sort column => -k3)
A sample file is as follows:
<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>解决方案
The linux date command does a fine job of parsing dates like this, and it can translate them into more sortable things, like simple unix-time integers.
Example:
cat file | while read line; do datestring=$(sed -e 's/^.* t="\([^"]*\)".*$/\1/' <<<"$line") echo "$(date -d "$datestring" +%s) $line" done | sort -nthen you could pass that through the appropriate cut invocation if you want that unix timestamp removed again.
更多推荐
bash的那种
发布评论