- 论坛徽章:
- 1
|
20可用积分
本帖最后由 Auroracxy 于 2014-08-28 13:57 编辑
日志格式: 时间戳(毫秒级别 除1000)|uid|id|source|status(状态有0,1,9三种)
1)中间三列$2 $3 $4组合起来代表唯一设备,只有当这个设备的status发生变化的时候则输出该行,比如持续的0变成了1;前后两条记录的时间戳差值小于60秒
2)如果某个设备前后两条记录的时间戳差值超过60秒,则插入一行信息:其中时间戳的值等于上一条记录的时间向后推10秒,status的值设置为10; 并输出下一条记录
3) 这个设备第一次出现在日志中的行 也输出出来
这样用日志举例
1409108810000|2090000199|869323003901382|adapt.a|0
1409108870000|2090000199|869323003901382|adapt.a|0
1409108880000|2090000199|869323003901382|adapt.a|1
1409108890000|2090000199|869323003901382|adapt.a|1
1409108900000|2090000199|869323003901382|adapt.a|1
1409108910000|2090000199|869323003901382|adapt.a|0
1409108810000|2090000199|860989025893705|adapt.b|0
1409108820000|2090000199|860989025893705|adapt.b|1
1409108830000|2090000199|860989025893705|adapt.b|1
1409108940000|2090000199|860989025893705|adapt.b|1
1409108950000|2090000199|860989025893705|adapt.b|0
1409108960000|2090000199|860989025893705|adapt.b|0
1409108970000|2090000199|860989025893705|adapt.b|9
1409108820000|2090000199|868145019649338|adapt.c|9
1409108830000|2090000199|868145019649338|adapt.c|9
1409108940000|2090000199|868145019649338|adapt.c|0
结果希望得到
1409108810000|2090000199|869323003901382|adapt.a|0
1409108820000|2090000199|869323003901382|adapt.a|10
1409108870000|2090000199|869323003901382|adapt.a|0
1409108880000|2090000199|869323003901382|adapt.a|1
1409108910000|2090000199|869323003901382|adapt.a|0
1409108810000|2090000199|860989025893705|adapt.b|0
1409108820000|2090000199|860989025893705|adapt.b|1
1409108840000|2090000199|860989025893705|adapt.b|10
1409108940000|2090000199|860989025893705|adapt.b|1
1409108950000|2090000199|860989025893705|adapt.b|0
1409108970000|2090000199|860989025893705|adapt.b|9
1409108820000|2090000199|868145019649338|adapt.c|9
1409108840000|2090000199|868145019649338|adapt.c|10
1409108940000|2090000199|868145019649338|adapt.c|0
万分感谢
根据自己需求修改了一下这位朋友的答案, 结果:
awk 'BEGIN{FS=OFS="|"}{t=$2$3$4;a[t]=$1;c[t]=$5;if(b[t]==""){print $0};if(a[t]>=b[t]+60000 && b[t]!=""){x=$1;y=$5;$5=10;$1=b[t]+10000;print $0;$1=x;$5=y;print $0};if(c[t]!=d[t] && a[t]<b[t]+60000 && d[t]!=""){print $0};b[t]=a[t];d[t]=c[t]}' urfile |
|