如何用AWK - 脚本减去毫秒

时间:2012-01-23 14:50:48

标签: awk

我正在尝试创建一个awk脚本来减去连接的两个记录之间的毫秒数,例如:

通过命令行我可以这样做:

输入:

06:20:00.120
06:20:00.361
06:20:15.205
06:20:15.431
06:20:35.073
06:20:36.190
06:20:59.604
06:21:00.514
06:21:25.145
06:21:26.125

命令:

awk '{ if ( ( NR % 2 ) == 0 ) { printf("%s\n",$0) } else { printf("%s ",$0) } }' input 

我会得到这个:

06:20:00.120 06:20:00.361
06:20:15.205 06:20:15.431
06:20:35.073 06:20:36.190
06:20:59.604 06:21:00.514
06:21:25.145 06:21:26.125

正确减去毫秒:

awk '{ if ( ( NR % 2 ) == 0 ) { printf("%s\n",$0) } else { printf("%s ",$0) } }' input| awk -F':| ' '{print $3, $6}'

为了避免负数:

awk '{if ($2<$1) sub(/00/, "60",$2); print $0}'
awk '{$3=($2-$1); print $3}'

目标是得到这个:

Call 1 0.241 ms
Call 2 0.226 ms
Call 3 1.117 ms
Call 4 0.91 ms
Call 5 0.98 ms

最后和平均。

我可能会按命令执行此命令。我不知道如何将它放入剧本中。

请帮助。

3 个答案:

答案 0 :(得分:3)

使用awk

awk '
BEGIN { cmd = "date +%s.%N -d " }
NR%2  {
    cmd $0 | getline var1;
    next
}
{
    cmd $0 | getline var2;
    var3 = var2 - var1;
    print "Call " ++i, var3 " ms"
}
' file
Call 1 0.241 ms
Call 2 0.226 ms
Call 3 1.117 ms
Call 4 0.91 ms
Call 5 0.98 ms

答案 1 :(得分:2)

使用awk的一种方式:

script.awk的内容:

## For every input line.
{
        ## Convert formatted dates to time in miliseconds.
        t1 = to_ms( $0 )
        getline
        t2 = to_ms( $0 )

        ## Calculate difference between both dates in miliseconds.
        tr = (t1 >= t2) ? t1 - t2 : t2 - t1

        ## Print to output with time converted to a readable format.
        printf "Call %d %s ms\n", ++cont, to_time( tr )
}

## Convert a date in format hh:mm:ss:mmm to miliseconds.
function to_ms(time,    time_ms, time_arr)
{
        split( time, time_arr, /:|\./ )
        time_ms = ( time_arr[1] * 3600 + time_arr[2] * 60 + time_arr[3] ) * 1000 + time_arr[4]
        return time_ms
}


## Convert a time in miliseconds to format hh:mm:ss:mmm. In case of 'hours' or 'minutes'
## with a value of 0, don't print them.
function to_time(i_ms,         time)
{
        ms = int( i_ms % 1000 )
        s = int( i_ms / 1000 )
        h = int( s / 3600 )
        s = s % 3600
        m = int( s / 60 )
        s = s % 60
#       time = (h != 0 ? h ":" : "")  (m != 0 ? m ":" : "") s "." ms
        time = (h != 0 ? h ":" : "")  (m != 0 ? m ":" : "") s "." sprintf( "%03d", ms )
        return time
}

运行脚本:

awk -f script.awk infile

结果:

Call 1 0.241 ms
Call 2 0.226 ms
Call 3 1.117 ms
Call 4 0.910 ms
Call 5 0.980 ms

答案 2 :(得分:2)

如果你不依赖于awk:

to_epoch() { date -d "$1" "+%s.%N"; }
count=0
paste - - < input |
while read t1 t2; do
    ((count++))
    diff=$(printf "%s-%s\n" $(to_epoch "$t2") $(to_epoch "$t1") | bc -l)
    printf "Call %d %5.3f ms\n" $count $diff
done