免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Auroracxy
打印 上一主题 下一主题

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

论坛徽章:
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
11 [报告]
发表于 2014-08-27 15:47 |只看该作者
我想问一下如果两者都符合应该输出什么?{:2_172:}

论坛徽章:
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
12 [报告]
发表于 2014-08-27 15:57 |只看该作者
这个我疑问我也有?

论坛徽章:
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
13 [报告]
发表于 2014-08-27 16:00 |只看该作者
回复 10# yestreenstars
NR>1只能规避掉第一行的处理
后面adapt.b,adapt.c,第一行怎么规避呢?

论坛徽章:
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
14 [报告]
发表于 2014-08-27 16:03 |只看该作者
回复 13# chengchow

之所以加上NR>1,是因为从第二行开始,变量a、b、c才开始有值。
   

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
15 [报告]
发表于 2014-08-27 16:08 |只看该作者
回复 1# Auroracxy
  1. awk -F \| '$2"|"$3"|"$4==pid{if($5!=ps) print $0;if($1-pt>=60000) print pt+10000"|"pid"|"10;}{pt=$1;ps=$5;pid=$2"|"$3"|"$4}' urfile
复制代码

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
16 [报告]
发表于 2014-08-27 16:19 |只看该作者
回复 14# yestreenstars


    需求不好明白。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
17 [报告]
发表于 2014-08-27 17:36 |只看该作者
本帖最后由 Auroracxy 于 2014-08-27 18:01 编辑

回复 12# chengchow


    不好意思,我也发现需求确实有问题,会丢数据,修正一下:

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

谢谢 劳烦了

论坛徽章:
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
18 [报告]
发表于 2014-08-27 17:55 |只看该作者
回复 17# Auroracxy

如果同时满足1和2呢?
   

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


    我给条件1后面加了个条件:$5变化时上下记录的时间戳差值小于60秒,这样应该不会有歧义了

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
20 [报告]
发表于 2014-08-27 18:05 |只看该作者
本帖最后由 Auroracxy 于 2014-08-27 18:05 编辑

回复 13# chengchow


    顺着你的思路我改动了一下,看似能满足我自己的条件了
awk 'BEGIN{FS=OFS="|"}{a[$2$3$4]=$1;c[$2$3$4]=$5;if(b[$2$3$4]==""){print $0};if(a[$2$3$4]>=b[$2$3$4]+60000 && b[$2$3$4]!=""){x=$1;y=$5;$5=10;$1=b[$2$3$4]+10000;print $0;$1=x;$5=y;print $0};if(c[$2$3$4]!=d[$2$3$4] && a[$2$3$4]<b[$2$3$4]+60000 && d[$2$3$4]!=""){print $0};b[$2$3$4]=a[$2$3$4];d[$2$3$4]=c[$2$3$4]}'  file



yestreenstars兄写的我还没看懂。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP