如何匹配最早和最新的开始时间并打印它们以及相应的详细信息?

时间:2019-03-30 17:23:31

标签: regex bash awk

我需要使用awk打印每个用户的最早和最晚开始时间及其相应信息。我不允许使用排序。如果有最晚开始时间或最早开始时间,请选择UID以字母顺序排在第一位的时间。

这是我到目前为止尝试过的:

BEGIN { }
{
   if( $5 <= $5 ) {
     lateTime = $5;
   }
   else {
     earlyTime = $5;
   }
END {
    print("Earliest Start Time:", $1, $2, $3, $4, earlyTime, $5, $6, $7);
    print("Latest Start Time:", $1, $2, $3, $4, lateTine, $5, $6, $7);
}

在迭代过程中,我尝试将第5个字段与其自身进行比较,但是我在逻辑上遇到了麻烦。任何帮助表示赞赏。

我收到了这个文本文件。

UID   PID  PPID C STIME TTY    TIME     CMD
adz110 5344 5334 0 08:47 pts/2  00:00:00 bash
dmq292 6908 6854 0 08:53 pts/1  00:00:00 bash
adz110 7227 7150 0 08:54 pts/9  00:00:00 who
erg474 7466 7461 0 08:54 pts/10 00:00:00 ls
dmq292 7966 7960 0 08:55 pts/13 00:00:00 assign1 . sh if of
xle135 8636 8628 0 08:58 pts/15 00:00:00 bash
xle135 8983 8636 0 08:59 pts/15 00:00:00 ssh ctf . cs . utsarr . net
zeh458 9057 1980 0 08:59 pts/7  00:00:00 vim prog . c

,然后需要如下所示:

Earliest Start Time:
adz110 5344 5334 0 08:47 pts/2 00:00:00 bash
Latest Start Time:
xle135 8983 8636 0 08:59 pts/15 00:00:00 ssh ctf.cs.utsarr.net

2 个答案:

答案 0 :(得分:2)

尝试一下:

awk 'FNR==1{next} FNR==2{timeE=timeL=$5;lineE=lineL=$0;} timeE>$5{lineE=$0;timeE=$5} timeL<$5{lineL=$0;timeL=$5} END{print "Earliest Start Time:\n" lineE "\nLatest Start Time:\n" lineL}' file

多行输入以提高可读性:

awk '
FNR==1{next}
FNR==2{
    timeE=timeL=$5;
    lineE=lineL=$0;
} 

timeE>$5{
    lineE=$0;
    timeE=$5
} 

timeL<$5{
    lineL=$0;
    timeL=$5
} 

END{
    print "Earliest Start Time:\n" lineE "\nLatest Start Time:\n" lineL
}' file

答案 1 :(得分:0)

鉴于您提供的输入是:

$ awk 'FNR==2{beg=$0} !seen[$5]++{end=$0} END{print "Earliest" ORS beg ORS "Latest" ORS end}' file
Earliest
adz110 5344 5334 0 08:47 pts/2  00:00:00 bash
Latest
xle135 8983 8636 0 08:59 pts/15 00:00:00 ssh ctf . cs . utsarr . net

如果这还不够,请更新您的问题以提供更真实的代表性样本输入/输出。