免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 5306 | 回复: 32
打印 上一主题 下一主题

[文本处理] 工作中遇到个文本处理求助,awk [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-27 13:46 |只看该作者 |倒序浏览
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

最佳答案

查看完整内容

上面写的有点问题,这样就可以了!

论坛徽章:
24
申猴
日期:2014-10-10 15:56:39射手座
日期:2014-10-10 15:57:18黑曼巴
日期:2018-05-14 11:05:122016科比退役纪念章
日期:2018-05-14 11:05:0715-16赛季CBA联赛之北控
日期:2018-05-14 11:05:0015-16赛季CBA联赛之江苏
日期:2017-02-27 18:11:0715-16赛季CBA联赛之上海
日期:2018-08-15 09:48:5415-16赛季CBA联赛之佛山
日期:2018-07-20 17:14:2315-16赛季CBA联赛之佛山
日期:2019-09-10 18:08:4615-16赛季CBA联赛之山西
日期:2020-03-26 09:40:5115-16赛季CBA联赛之佛山
日期:2020-05-08 09:03:54
2 [报告]
发表于 2014-08-27 13:46 |只看该作者
本帖最后由 chengchow 于 2014-08-27 15:26 编辑
  1. awk 'BEGIN{FS=OFS="|"}{a[$2$3$4]=$1;c[$2$3$4]=$5;if(a[$2$3$4]>=b[$2$3$4]+60000 && b[$2$3$4]!=""){$5=10;$1=b[$2$3$4]+10000;print $0};if(c[$2$3$4]!=d[$2$3$4] && d[$2$3$4]!=""){print $0};b[$2$3$4]=a[$2$3$4];d[$2$3$4]=c[$2$3$4]}' file
  2. 1409108820000|2090000199|869323003901382|adapt.a|10
  3. 1409108880000|2090000199|869323003901382|adapt.a|1
  4. 1409108910000|2090000199|869323003901382|adapt.a|0
  5. 1409108820000|2090000199|860989025893705|adapt.b|1
  6. 1409108840000|2090000199|860989025893705|adapt.b|10
  7. 1409108950000|2090000199|860989025893705|adapt.b|0
  8. 1409108970000|2090000199|860989025893705|adapt.b|9
  9. 1409108840000|2090000199|868145019649338|adapt.c|0
复制代码
上面写的有点问题,这样就可以了!

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
3 [报告]
发表于 2014-08-27 13:53 |只看该作者
给多点数据,然后给个处理结果

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
4 [报告]
发表于 2014-08-27 14:03 |只看该作者
本帖最后由 关阴月飞 于 2014-08-27 14:11 编辑

目测一下:
  1. awk -F\| '{k=$2$3$4} a[k]!=""&&a[k]!=$NF{print}  b[k]!=""&&$1-b[k]>6000{$1=b[k]+10;$NF=10;print} {a[k]=$NF;b[k]=$1}'  OFS=\| urfile
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2014-08-27 14:28 |只看该作者
回复 2# yestreenstars


    日志已更新

论坛徽章:
24
申猴
日期:2014-10-10 15:56:39射手座
日期:2014-10-10 15:57:18黑曼巴
日期:2018-05-14 11:05:122016科比退役纪念章
日期:2018-05-14 11:05:0715-16赛季CBA联赛之北控
日期:2018-05-14 11:05:0015-16赛季CBA联赛之江苏
日期:2017-02-27 18:11:0715-16赛季CBA联赛之上海
日期:2018-08-15 09:48:5415-16赛季CBA联赛之佛山
日期:2018-07-20 17:14:2315-16赛季CBA联赛之佛山
日期:2019-09-10 18:08:4615-16赛季CBA联赛之山西
日期:2020-03-26 09:40:5115-16赛季CBA联赛之佛山
日期:2020-05-08 09:03:54
6 [报告]
发表于 2014-08-27 14:44 |只看该作者
awk 'BEGIN{FS=OFS="|"}{a[$2$3$4]=$1;if(a[$2$3$4]>=b[$2$3$4]+60000 && b[$2$3$4]!=""){$5=10;$1=b[$2$3$4]+10000};b[$2$3$4]=a[$2$3$4];}!a[$2$3$4$5]++' file
1409108810000|2090000199|869323003901382|adapt.a|0
1409108820000|2090000199|869323003901382|adapt.a|10   ##条件2
1409108880000|2090000199|869323003901382|adapt.a|1
1409108810000|2090000199|860989025893705|adapt.b|0
1409108820000|2090000199|860989025893705|adapt.b|1
1409108840000|2090000199|860989025893705|adapt.b|10   ## 条件2
1409108970000|2090000199|860989025893705|adapt.b|9
1409108820000|2090000199|868145019649338|adapt.c|9
1409108840000|2090000199|868145019649338|adapt.c|0

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2014-08-27 15:12 |只看该作者
回复 5# chengchow


    您好请问结尾的
!a[$2$3$4$5]++  是什么意思呀?

论坛徽章:
24
申猴
日期:2014-10-10 15:56:39射手座
日期:2014-10-10 15:57:18黑曼巴
日期:2018-05-14 11:05:122016科比退役纪念章
日期:2018-05-14 11:05:0715-16赛季CBA联赛之北控
日期:2018-05-14 11:05:0015-16赛季CBA联赛之江苏
日期:2017-02-27 18:11:0715-16赛季CBA联赛之上海
日期:2018-08-15 09:48:5415-16赛季CBA联赛之佛山
日期:2018-07-20 17:14:2315-16赛季CBA联赛之佛山
日期:2019-09-10 18:08:4615-16赛季CBA联赛之山西
日期:2020-03-26 09:40:5115-16赛季CBA联赛之佛山
日期:2020-05-08 09:03:54
8 [报告]
发表于 2014-08-27 15:16 |只看该作者
回复 6# Auroracxy
这个有问题,!a[$2$3$4$5]++
是2-3-4-5列相同的行只打印第一行,用在这里有点问题,刚才改了写法!

   

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2014-08-27 15:31 |只看该作者
回复 7# chengchow


    非常感谢 ,我先学习一下您写的

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
10 [报告]
发表于 2014-08-27 15:45 |只看该作者
回复 4# Auroracxy

骚年,how about this?
  1. $ awk 'BEGIN{FS=OFS="|"}NR>1{if($2 FS $3 FS $4==b){if($1-a>=60000)print a+10000,b,10;else if($NF!=c)print}}{a=$1;b=$2 FS $3 FS $4;c=$NF}' i
  2. 1409108820000|2090000199|869323003901382|adapt.a|10
  3. 1409108880000|2090000199|869323003901382|adapt.a|1
  4. 1409108910000|2090000199|869323003901382|adapt.a|0
  5. 1409108820000|2090000199|860989025893705|adapt.b|1
  6. 1409108840000|2090000199|860989025893705|adapt.b|10
  7. 1409108950000|2090000199|860989025893705|adapt.b|0
  8. 1409108970000|2090000199|860989025893705|adapt.b|9
  9. 1409108840000|2090000199|868145019649338|adapt.c|0
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP