获取最后 5 分钟的数据并添加列并对失败的输出进行编号

获取最后 5 分钟的数据并添加列并对失败的输出进行编号

我需要您的专家建议才能获得以下输出

输入

2020-01-09 15:39:39,sharm,07296,97  
2020-01-09 15:40:40,SRI,6657,197  
2020-01-09 15:42:40,rinku,null,0  
2020-01-09 15:42:40,SVRMO,8588,39  
2020-01-09 15:44:58,MASTA,093720,48  

在这里,获取最后 5 分钟的数据。假设该命令在 15:45 运行,则应选择 (15:40-15:45) 的数据。

2020-01-09 15:40:40,SRI,6657,197  
2020-01-09 15:42:40,rinku,null,0  
2020-01-09 15:42:40,SVRMO,8588,39  
2020-01-09 15:44:58,MASTA,093720,48

输出应该是

284,4,3   

在哪里

  • 284 显示最后一行数据的总和 (197+0+39+48)
  • 4 显示最近5分钟内的数据总数
  • 3 显示最后一列值不为 0 的数据总数(在示例中:第 1,3 和 4 行,值分别为 197,39 和 48)

答案1

下面的awk命令首先获取当前和过去 5 分钟的日期,并将它们转换为纪元时间(Unix时间)并设置在开始时间时间结束分别;然后对于我们读取的每一行,它还将第一个字段日期列转换为纪元,并检查时间是否在 startTime 和 endTime 之间,然后进行所需的计算。在 中,END我们打印 的最后一个值sumtotal以及nonZero计算出的变量。

awk -vstartTime="$(date -d'-5 minutes' '+%s')" \
    -vendTime="$(date '+%s')" \
    -F, '{ epoch="date -d\"" $1 "\" +%s"; epoch |getline timestamp; }
         (timestamp>=startTime && timestamp<=endTime){ sum+=$NF; total++; if($NF!=0)nonZero++ }
END{ print sum, total, nonZero }' OFS=, infile

手动测试给定的测试数据:

awk -vstartTime=1578571800 \
    -vendTime=1578572100 \
    -F, '{ epoch="date -d\"" $1 "\" +%s"; epoch |getline timestamp; }
         (timestamp>=startTime && timestamp<=endTime){ sum+=$NF; total++; if($NF!=0)nonZero++ }
END{ print sum, total, nonZero }' OFS=, infile

相关内容