我需要您的专家建议才能获得以下输出
输入
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
我们打印 的最后一个值sum
,total
以及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