获取具有固定时间戳的列的MAx值

时间:2019-01-03 19:41:37

标签: bash awk

我有一个带有时间戳和12列数据的文件。此数据每秒转储一次,我需要在每分钟内选择第6列的MAX值。我什至不知道该从头开始。我想做以下事情,但不知道如何从小组会议中脱身。如果数据超过24小时该怎么办?因此无法使用此方法。我认为我需要以某种方式创建一组60行,然后对其中的数据进行排序,但不确定如何做到这一点。

<form id="loginform" method="post" action="/login/in">
    <!--<div class="form-group">-->
        <input type="Login" class="form-control" id="Login" name="Login" placeholder="Login">
    <!--</div>-->
    <div class="form-group">
        <input type="Password" class="form-control" id="Password" name="Password" placeholder="Password">
    </div>
    <input type="hidden" name="{{ csrf_name }}" value="{{ csrf_value }}">
    <button id="submit" type="submit" class="btn btn-secondary">Login</button>
</form>

例如:输入数据

cat file |sort -k6  -r |awk '!a[$1]++' |sort -k1  

预期输出:

16:06:00       0    1.01    0.00    4.04    1.00    0.00    0.00    0.00    0.00    0.00   94.95
16:06:01       0    0.00    0.00    2.00    2.00    0.00    0.00    0.00    0.00    0.00   98.00
16:06:02       0    3.03    0.00    6.06    5.00    0.00    0.00    0.00    0.00    0.00   90.91
16:06:03       0    4.08    1.02    2.04    2.00    0.00    0.00    0.00    0.00    0.00   92.86
...
...
16:06:59       0    4.08    1.02    2.04    3.00    0.00    0.00    0.00    0.00    0.00   92.86
16:07:00       0    1.01    0.00    4.04    4.00    0.00    0.00    0.00    0.00    0.00   94.95
16:07:01       0    0.00    0.00    2.00    5.00    0.00    0.00    0.00    0.00    0.00   98.00
16:07:02       0    3.03    0.00    6.06    9.00    0.00    0.00    0.00    0.00    0.00   90.91
16:07:03       0    4.08    1.02    2.04    0.00    0.00    0.00    0.00    0.00    0.00   92.86
...
...
16:07:59       0    4.08    1.02    2.04    0.00    0.00    0.00    0.00    0.00    0.00   92.86
...
...

3 个答案:

答案 0 :(得分:3)

awk来营救!

$ awk '        {split($1,a,":"); k=a[1]a[2]} 
     max[k]<$6 {max[k]=$6; maxR[k]=$0} 
     END       {for(r in maxR) print maxR[r]}' file

16:06:02       0    3.03    0.00    6.06    5.00    0.00    0.00    0.00    0.00    0.00   90.91
16:07:02       0    3.03    0.00    6.06    9.00    0.00    0.00    0.00    0.00    0.00   90.91

请注意,max未初始化(隐式初始化为零),如果所有值均为负,则将无法使用。解决方法很简单,但在这种情况下可能不需要。

该替代方法假定按时间排序的记录并以一分钟为间隔打印最大值,因此不会合并不同的日期。

$ awk      '{split($1,a,":"); k=a[1]a[2]} 
     max<$6 {max=$6; maxR=$0} 
     p!=k   {if(p) print maxR; p=k} 
     END    {print maxR}' file 

16:06:02       0    3.03    0.00    6.06    5.00    0.00    0.00    0.00    0.00    0.00   90.91
16:07:02       0    3.03    0.00    6.06    9.00    0.00    0.00    0.00    0.00    0.00   90.91

答案 1 :(得分:0)

使用Perl

def main():
    jobs = []
    for project in projects:
        for target in project.getTargets():
            p = multiprocessing.Process(target=run, args=(target.getX(),  
                                                          target.getY(),))
            jobs.append(p)
            p.start()

        for job in jobs:
            job.join()

def run(x, y):
    a(x, y)
    b(x, y)
    c(x, y)
    d(x, y)

$ cat monk.log
16:06:00       0    1.01    0.00    4.04    1.00    0.00    0.00    0.00    0.00    0.00   94.95
16:06:01       0    0.00    0.00    2.00    2.00    0.00    0.00    0.00    0.00    0.00   98.00
16:06:02       0    3.03    0.00    6.06    5.00    0.00    0.00    0.00    0.00    0.00   90.91
16:06:03       0    4.08    1.02    2.04    2.00    0.00    0.00    0.00    0.00    0.00   92.86
16:06:59       0    4.08    1.02    2.04    3.00    0.00    0.00    0.00    0.00    0.00   92.86
16:07:00       0    1.01    0.00    4.04    4.00    0.00    0.00    0.00    0.00    0.00   94.95
16:07:01       0    0.00    0.00    2.00    5.00    0.00    0.00    0.00    0.00    0.00   98.00
16:07:02       0    3.03    0.00    6.06    9.00    0.00    0.00    0.00    0.00    0.00   90.91
16:07:03       0    4.08    1.02    2.04    0.00    0.00    0.00    0.00    0.00    0.00   92.86
16:07:59       0    4.08    1.02    2.04    0.00    0.00    0.00    0.00    0.00    0.00   92.86


$ perl -F'/\s+/' -lane '  $F[0]=~/(.*):/ and $x=$1 ; if( $F[5]>$kv{$x} ) { $kv{$x}=$F[5]; $kv2{$x}=$_ } END { print "$kv2{$_}" for(keys %kv) } ' monk.log
16:06:02       0    3.03    0.00    6.06    5.00    0.00    0.00    0.00    0.00    0.00   90.91
16:07:02       0    3.03    0.00    6.06    9.00    0.00    0.00    0.00    0.00    0.00   90.91

答案 2 :(得分:0)

awk +排序

import Foundation

extension Array {
    mutating func shuffle() {
        if count < 2 { return }
        for i in 0..<(count - 1) {
            let j = Int(arc4random_uniform(UInt32(count - i))) + i 
            customSwap(a: &self[i], b: &self[j])
        }
    }
}

func customSwap<T>(a:inout T, b:inout T) {
    let temp = a
    a = b
    b = temp
}

$ cat monk.log
16:06:00       0    1.01    0.00    4.04    1.00    0.00    0.00    0.00    0.00    0.00   94.95
16:06:01       0    0.00    0.00    2.00    2.00    0.00    0.00    0.00    0.00    0.00   98.00
16:06:02       0    3.03    0.00    6.06    5.00    0.00    0.00    0.00    0.00    0.00   90.91
16:06:03       0    4.08    1.02    2.04    2.00    0.00    0.00    0.00    0.00    0.00   92.86
16:06:59       0    4.08    1.02    2.04    3.00    0.00    0.00    0.00    0.00    0.00   92.86
16:07:00       0    1.01    0.00    4.04    4.00    0.00    0.00    0.00    0.00    0.00   94.95
16:07:01       0    0.00    0.00    2.00    5.00    0.00    0.00    0.00    0.00    0.00   98.00
16:07:02       0    3.03    0.00    6.06    9.00    0.00    0.00    0.00    0.00    0.00   90.91
16:07:03       0    4.08    1.02    2.04    0.00    0.00    0.00    0.00    0.00    0.00   92.86
16:07:59       0    4.08    1.02    2.04    0.00    0.00    0.00    0.00    0.00    0.00   92.86

$ awk ' { split($1,t,":"); $(NF+1)=t[1]t[2] }1 ' monk.log | sort -k12 -n -k6  | awk ' !a[$NF] { a[$NF]++ ; NF--; print} '
16:06:02 0 3.03 0.00 6.06 5.00 0.00 0.00 0.00 0.00 0.00 90.91
16:07:02 0 3.03 0.00 6.06 9.00 0.00 0.00 0.00 0.00 0.00 90.91