免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3693 | 回复: 9

[文本处理] shell可以去重合并这样的数据吗 [复制链接]

论坛徽章:
0
发表于 2017-09-13 22:32 |显示全部楼层
有一组日志是这样的 ,有8列值,但是有很多重复的,想合并一下,最终每个用户都变成一行有用的数据
  1. 15-11-04 20:08:23 145998865 2345678 0 0 0 0
  2. 15-11-04 20:08:23 145998865 2345678 0 0 0 0
  3. 15-11-04 20:08:23 145998865 2345678 0 0 0 0
  4. 15-11-04 20:09:19 145998865 0 北京xx公司 0 0 0
  5. 15-11-04 20:09:19 145998865 0 北京xx公司 王二麻子+18512345678 0 0
  6. 15-11-04 20:09:21 145998865 0 北京xx公司 0 nodata 0
  7. 15-11-04 20:09:21 145998865 0 北京xx公司 0 0 0
  8. 15-11-04 20:09:21 145998865 0 北京xx公司 0 0 0
  9. 15-11-04 20:09:31 145998865 0 北京xx公司 0 0 0
  10. 15-11-04 20:09:31 145998865 0 北京xx公司 王二麻子+18512345678 0 0
  11. 15-11-04 20:09:32 145998865 0 北京xx公司 0 nodata 0
  12. 15-11-04 20:09:32 145998865 0 北京xx公司 0 0 0
  13. 15-11-04 20:09:32 145998865 0 北京xx公司 0 0 0
  14. 15-11-04 20:21:58 123466666 0 上海xx公司 0 0 0
  15. 15-11-04 20:21:58 123466666 0 上海xx公司 0 0 0
  16. 15-11-04 20:21:32 123466666 19003457 0 0 0 0
  17. 15-11-04 20:21:32 123466666 19003457 0 0 0 0
  18. 15-11-04 20:21:32 123466666 19003457 0 0 0 0
  19. 15-11-04 20:22:13 123466666 0 0 张三+13912345678 0 0
复制代码




想经过处理之后变成这样的,其实就合并相同的,把有用的值最终合并到一行显示,如下所示,shell可以做到吗,请大牛指定一下


  1. 15-11-04 20:08:23 145998865 2345678 北京xx公司 王二麻子+18512345678 0 0
  2.   15-11-04 20:22:13 123466666 19003457 上海xx公司 张三+13912345678 0 0
复制代码




论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2017-09-14 07:46 |显示全部楼层
回复 1# zxx1988328

How about this way ...

$ awk '{if(!a[$3]++)c[$3]=++C;k=c[$3];for(n=1;n<=NF;++n)if($n||a[$3]==1)d[k,n]=$n}END{for(k=1;k<=C;++k){s="";for(n=1;n<=NF;++n)s=s d[k,n]" ";print s}}' FILE
15-11-04 20:09:32 145998865 2345678 北京xx公司 王二麻子+18512345678 nodata 0
15-11-04 20:22:13 123466666 19003457 上海xx公司 张三+13912345678 0 0

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2017-09-14 09:26 |显示全部楼层
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use utf8;
  5. use Encode qw(encode);

  6. my %hData = ();
  7. while(<DATA>){
  8.         my @aT = split;
  9.         if(!exists($hData{$aT[2]})){
  10.                 $hData{$aT[2]} = [@aT];
  11.                 next;
  12.         }
  13.         my $it = $hData{$aT[2]};
  14.         foreach(grep {$aT[$_] !~/\A(0|nodata)\z/ and $it->[$_] eq 0} 0 .. $#aT){
  15.                 $it->[$_] = $aT[$_];
  16.         }
  17. }

  18. print(encode('gb2312', join(" ", @{$hData{$_}})), "\n") for keys %hData;

  19. __DATA__
  20. 15-11-04 20:08:23 145998865 2345678 0 0 0 0
  21. 15-11-04 20:08:23 145998865 2345678 0 0 0 0
  22. 15-11-04 20:08:23 145998865 2345678 0 0 0 0
  23. 15-11-04 20:09:19 145998865 0 北京xx公司 0 0 0
  24. 15-11-04 20:09:19 145998865 0 北京xx公司 王二麻子+18512345678 0 0
  25. 15-11-04 20:09:21 145998865 0 北京xx公司 0 nodata 0
  26. 15-11-04 20:09:21 145998865 0 北京xx公司 0 0 0
  27. 15-11-04 20:09:21 145998865 0 北京xx公司 0 0 0
  28. 15-11-04 20:09:31 145998865 0 北京xx公司 0 0 0
  29. 15-11-04 20:09:31 145998865 0 北京xx公司 王二麻子+18512345678 0 0
  30. 15-11-04 20:09:32 145998865 0 北京xx公司 0 nodata 0
  31. 15-11-04 20:09:32 145998865 0 北京xx公司 0 0 0
  32. 15-11-04 20:09:32 145998865 0 北京xx公司 0 0 0
  33. 15-11-04 20:21:58 123466666 0 上海xx公司 0 0 0
  34. 15-11-04 20:21:58 123466666 0 上海xx公司 0 0 0
  35. 15-11-04 20:21:32 123466666 19003457 0 0 0 0
  36. 15-11-04 20:21:32 123466666 19003457 0 0 0 0
  37. 15-11-04 20:21:32 123466666 19003457 0 0 0 0
  38. 15-11-04 20:22:13 123466666 0 0 张三+13912345678 0 0
复制代码

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
发表于 2017-09-14 11:42 |显示全部楼层
回复 1# zxx1988328

  1. awk '{for(i=1;i<=NF;i++){$i=$i=="nodata"?0:$i;a[$3][i]=a[$3][i]?a[$3][i]:$i}}END{for(i in a){for(j=1;j<=NF;j++){s[i]=s[i]?s[i]" "a[i][j]:a[i][j]};print s[i]}}' file
复制代码


输出:
15-11-04 20:21:58 123466666 19003457 上海xx公司 张三+13912345678 0 0
15-11-04 20:08:23 145998865 2345678 北京xx公司 王二麻子+18512345678 0 0

论坛徽章:
0
发表于 2017-09-14 12:10 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
发表于 2017-09-14 12:16 |显示全部楼层
回复 2# jason680

大神可以讲解下这个命令吗,用中文,谢谢啊

论坛徽章:
0
发表于 2017-09-14 12:20 |显示全部楼层
本帖最后由 zxx1988328 于 2017-09-14 12:22 编辑

回复 5# 本友会机友会摄友会

我大概解释下日期       时间       uid          另一个id 公司名称 用户名+手机号 状态值1 状态值2
15-11-04 20:08:23 145998865 2345678 0 0 0 0

其实就是一个用户的多次请求,每次请求被记录的日志数据不一样,有的请求日志里只记录了公司名称,有的记录了uid等等,所以想合并一下,合并结果是:每个用户只有一行日志记录

论坛徽章:
0
发表于 2017-09-14 12:21 |显示全部楼层
回复 3# sunzhiguolu

谢谢大神,暂时只考虑shell来执行,不考虑perl,而且还不太会perl

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2017-09-14 12:37 |显示全部楼层
回复 6# zxx1988328

http://bbs.chinaunix.net/thread-2309494-1-1.html


$ awk '
{
  if(!a[$3]++)c[$3]=++C;
  k=c[$3];
  for(n=1;n<=NF;++n)
    if($n||a[$3]==1)d[k,n]=$n
}
END{
  for(k=1;k<=C;++k){
    s="";
    for(n=1;n<=NF;++n)
      s=s d[k,n]" ";
    print s
}
}
' FILE

论坛徽章:
0
发表于 2017-09-14 13:08 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP