计算并发事件数

时间:2018-06-22 08:26:45

标签: python bash awk

此问题与此处Number of consecutive values above certain cut off链接的上一个问题有关,与@kvantour所提供的答案略相关

因此,就我而言,我有这样的文件(样本输入

UIButton.reactive.pressed

首先:在我的情况下,如果2个或多个连续值满足给定的截止值c = 0.33,我将其称为B。这由条件m给出,请参见:Number of consecutive values above certain cut off

第二:如果c为0.33,并且我想要小于c的值,它将打印出0.32和0.323,但我也想打印出0.35,因为这只是c之上的一种情况,不符合我的规则m中提到的内容,因此也将被打印出来。 @kvantour回答了这个问题。我叫这个F

所以在我的$ 2中,状态看起来像这样 0.34 0.3432 0.32 0.35 0.323 0.3623 0.345 0.32 0.31 0.378 0.34 0.35 0.342

因此,我可以计算发生故障( B )的事件的数量,例如以下(样本输出

BCBCB

有没有一种方法可以计数并打印出编号。破碎事件列表?

2 个答案:

答案 0 :(得分:2)

awk(与朋友们一起营救)

$ awk 'NR>1{print ($2>0.33)}' file | uniq -c | awk '$2 && $1>1{print $1}'

2
2
4

说明

  

NR>1{print ($2>0.33)}打印1或0是否满足条件$2>0.33,跳过第一行标题行。

     

uniq -c计算连续的重复值(链长)

     

$2 && $1>1{print $1}在值非零(此处为1)且长度大于OP指定的长度时打印链长。

答案 1 :(得分:0)

问题

确定连续损坏多少帧。如果只有一帧坏了(但上一帧和下一帧都很好),那没关系,请忽略它。如果一帧的值大于临界值(0.33),则该帧将被破坏。

Python解决方案

rm -rf <Directory_Name>

读入输入

from itertools import groupby

我要根据空格分割每一行,而忽略帧号

def get_input():
    with open('input.txt') as f:
        next(f) # skip the first line
        input_list = []

这是一个辅助函数,如果该值大于临界值,则仅返回True或False

        for line in f:
            input_list.append(float(line.split()[1]))

    return input_list

这是有趣的部分。我们根据值是高于还是低于标准对值进行分组。我们回到小组,可以检查其中有多少人。

在下面的def above_cutoff(x, cutoff): return x > cutoff 循环中,如果组在截止点以上,则变量for将为aboveTrue是包含该组的生成器。我只是将其转换为列表,因为它更易于使用并检查其长度。

g

如果该组长于1,则符合您的条件,因此请添加其长度

def count_broken(input_list, cutoff):
    # returns list with number of values in a row above threshold
    state = []

    for above, g in groupby(input_list, lambda x: above_cutoff(x, cutoff)):
        group = list(g)
        print(above, group, len(group))

循环中的打印语句输出以下内容:

        if above and len(group) > 1:
            state.append(len(group))
    return state

input_list = get_input()
print(*count_broken(input_list, 0.33), sep='\n')

最终结果是:

True [0.34, 0.3432] 2
False [0.32] 1
True [0.35] 1 # while this group is True/in state B/broken, ignore it cause it is just 1 frame.
False [0.323] 1
True [0.3623, 0.345] 2
False [0.32, 0.31] 2
True [0.378, 0.34, 0.35, 0.342] 4

我的解决方案基于以下问题的可接受答案:Take in a list, return a list of True/False based on consecutive duplicate values