bash的那种 - 我怎么样使用时间戳 [英] bash sort - how do I sort using timestamp

查看:185
本文介绍了bash的那种 - 我怎么样使用时间戳的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要在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 -n

then you could pass that through the appropriate cut invocation if you want that unix timestamp removed again.

这篇关于bash的那种 - 我怎么样使用时间戳的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆