如何在unix中计算这个差异

时间:2014-06-14 06:26:40

标签: shell unix awk

我有一个名为Test1.dat的文件,其内容如下

Abcxxxxxxxxxxx_123.dat@10:10:15
Bcdxxxxxxxxxxx_145.dat@10:15:23
Cssxxxxxxxxxxx_567.dat@10:26:56
Fgsxxxxxxxxxxx_823.dat@10:46:56
Kssxxxxxxxxxxx_999.dat@11:15:23

请注意,在@符号后面是HH:MM:SS格式。我现在的问题是我想计算当前时间和文件中存在的时间之间的时间差,并仅获取时间差超过30分钟的文件名。因此,如果当前时间是11:00:00,我想获取30分钟前已到达的文件,所以基本上是前三个文件。

3 个答案:

答案 0 :(得分:2)

awk应该:

awk -F@ '$2>=from && $2<=to' from="$(date +%H:%M:%S -d -30min)" to="$(date +%H:%M:%S)" file

如果你只需要最后30分钟(在你的情况下你需要第一个,因为你不喜欢11:30):

awk -F@ '$2>=from' from="$(date +%H:%M:%S -d -30min)" file

答案 1 :(得分:1)

您也可以使用bash脚本获取结果

#!/bin/bash
current=`date  '+%s'`
needed_time=`echo "$current - 60 * 30" | bc`
while read line ; do 
    time=`echo $line |sed -r 's/[^@]*.(.*)/\1/g'` 
    user_time=`date -d $time '+%s'`
            if [ $user_time -le $needed_time ] ; then
            echo "$line"
    fi
done < file_name    

答案 2 :(得分:1)

这可能是答案吗?

awk -F@ '{ts = systime(); thirty_mins = 30 * 60; thirty_mins_ago = ts - thirty_mins;  if ($2 < strftime("%H:%M:%S", thirty_mins_ago)) print $2 }' <file.txt

strftime是GAWK(gnu awk)扩展名。