Shell 在AIX5.3中,如何在ksh中按hh:mm:ss.xx排序?

Shell 在AIX5.3中,如何在ksh中按hh:mm:ss.xx排序?,shell,unix,ksh,Shell,Unix,Ksh,我有很多这样的日志文件: …… …… cpu时间9.05秒 实时8:02.07 …… …… cpu时间2:25.23 实时1:39:44.15 …… ...... 为了获得所有的时间,我只需将所有的cpu时间和实时性进行grep即可。 然后,对grep输出文件进行排序。 我使用的是AIX5.2,有按字符串排序或按数字排序。 但是,没有按小时:分钟:秒分类 为了解决这个问题,我将grep输出行传递给while循环。 然后,使用sed's/:/00/g' 此新变量将使hh:mm:ss.xx变

我有很多这样的日志文件:


……
……
cpu时间9.05秒
实时8:02.07
……
……
cpu时间2:25.23
实时1:39:44.15
……
......


为了获得所有的时间,我只需将所有的cpu时间和实时性进行grep即可。
然后,对grep输出文件进行排序。
我使用的是AIX5.2,有按字符串排序或按数字排序。
但是,没有按小时:分钟:秒分类

为了解决这个问题,我将grep输出行传递给while循环。
然后,使用sed's/:/00/g'
此新变量将使hh:mm:ss.xx变为hh00mm00ss.xx
然后将这个新变量作为数字进行排序

通过这种方式,我可以找出最耗时的步骤。
这项工作可以,但速度有点慢

谁能有更好的选择吗?
提前谢谢


Alvin SIU

如果您显示脚本,它会有所帮助,但是我怀疑
while
循环是不必要的。试着这样做:

grep -E '^(cpu|real) time' | sed 's/:/00/' | sort -n

J p Linderman在《构建工作排序例程的理论与实践》一文中指出,要使具有复杂键的系统
Sort
命令(他正在研究的“排序例程”)获得良好性能,最好的方法是创建生成键的命令,使比较变得简单。在本例中,带有复杂键的sort命令为:

sort -t' ' -k 9,9.2 -k3 -k17
另一种机制使用一个密钥生成器,以便于排序:

keygen | sort | keystrip
密钥生成器是:

awk -F' ' '{printf "%s:%s:%s:%s\n", substr($9, 1, 2), $3, $17, $0}'
关键的剥离器是:

awk -F':' {printf "%s\n", $4}'
对于Lindeman处理的测试数据,这将复杂排序命令的运行时间从2100秒左右减少到
awk | sort | awk
组合的600秒左右


在这里采用这种思想,我将使用一个Perl脚本以
sort
可以轻松处理的格式统一呈现不同的时间值

在这种情况下,您似乎需要担心各种时间格式:

cpu time 9.05 seconds
real time 8:02.07
cpu time 2:25.23
real time 1:39:44.15
不清楚是否需要保留正在排序的行的上下文,但在我看来,我会将时间转换为规范形式。您是否需要考虑3位数的实时小时数?如果时间变为20.05秒,后缀是否保留?如果时间变为80.05秒,是否打印为1:20.05?我想是的

#!/usr/bin/env perl
use strict;
use warnings;

while (<>)
{
    if ($_ =~ m/ (?:cpu|real)\stime\s
                 (?:
                 (?:(\d+):)?      # Hours
                 (\d\d?):         # Minutes
                 )?
                 (\d\d?(?:\.\d+)) # Seconds
               /msx)
    {
        my($hh, $mm, $ss) = ($1, $2, $3);
        $hh //= 0;
        $mm //= 0;
        $_ = sprintf "%03d:%02d:%05.2f|%s", $hh, $mm, $ss, $_;
    }
    print;
}
这将生成输出数据:

000:00:09.05|cpu time 9.05 seconds
000:08:02.07|real time 8:02.07
000:02:25.23|cpu time 2:25.23
001:39:44.15|real time 1:39:44.15
000:00:25.23|cpu time 25.23 seconds
000:39:44.15|real time 39:44.15
000:00:05.23|cpu time 5.23 seconds
000:00:44.15|real time 44.15 seconds
000:01:44.15|real time 1:44.15
000:01:04.15|real time 1:04.15
000:21:04.15|real time 21:04.15
001:01:04.15|real time 1:01:04.15
032:21:04.15|real time 32:21:04.15
122:21:04.15|real time 122:21:04.15
可将其输入简单的
排序
,以产生:

000:00:05.23|cpu time 5.23 seconds
000:00:09.05|cpu time 9.05 seconds
000:00:25.23|cpu time 25.23 seconds
000:00:44.15|real time 44.15 seconds
000:01:04.15|real time 1:04.15
000:01:44.15|real time 1:44.15
000:02:25.23|cpu time 2:25.23
000:08:02.07|real time 8:02.07
000:21:04.15|real time 21:04.15
000:39:44.15|real time 39:44.15
001:01:04.15|real time 1:01:04.15
001:39:44.15|real time 1:39:44.15
032:21:04.15|real time 32:21:04.15
122:21:04.15|real time 122:21:04.15
cpu time 5.23 seconds
cpu time 9.05 seconds
cpu time 25.23 seconds
real time 44.15 seconds
real time 1:04.15
real time 1:44.15
cpu time 2:25.23
real time 8:02.07
real time 21:04.15
real time 39:44.15
real time 1:01:04.15
real time 1:39:44.15
real time 32:21:04.15
real time 122:21:04.15
从中可以使用“sed”剥离排序列,以产生:

000:00:05.23|cpu time 5.23 seconds
000:00:09.05|cpu time 9.05 seconds
000:00:25.23|cpu time 25.23 seconds
000:00:44.15|real time 44.15 seconds
000:01:04.15|real time 1:04.15
000:01:44.15|real time 1:44.15
000:02:25.23|cpu time 2:25.23
000:08:02.07|real time 8:02.07
000:21:04.15|real time 21:04.15
000:39:44.15|real time 39:44.15
001:01:04.15|real time 1:01:04.15
001:39:44.15|real time 1:39:44.15
032:21:04.15|real time 32:21:04.15
122:21:04.15|real time 122:21:04.15
cpu time 5.23 seconds
cpu time 9.05 seconds
cpu time 25.23 seconds
real time 44.15 seconds
real time 1:04.15
real time 1:44.15
cpu time 2:25.23
real time 8:02.07
real time 21:04.15
real time 39:44.15
real time 1:01:04.15
real time 1:39:44.15
real time 32:21:04.15
real time 122:21:04.15
因此,假设数据文件是'xx.data',Perl脚本是xx.pl,那么命令行是:

perl xx.pl xx.data | sort | sed 's/^[^|]*|//'

是的,我需要保留行的上下文。你能读懂我的心思。谢谢