忘记密码   免费注册 查看新帖 | 论坛精华区

ChinaUnix.net

  平台 论坛 博客 认证专区 大话IT HPC论坛 徽章 文库 沙龙 自测 下载 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 732 | 回复: 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
复制代码




论坛徽章:
120
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07巳蛇
日期:2014-05-09 16:43:18巨蟹座
日期:2014-10-23 17:48:38子鼠
日期: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
发表于 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
复制代码

论坛徽章:
2
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之同曦
日期:2017-09-11 14:39:48
发表于 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 |显示全部楼层
这里面有个问题:
第一行,如果是含,2345679怎么处理?

论坛徽章:
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

论坛徽章:
120
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07巳蛇
日期:2014-05-09 16:43:18巨蟹座
日期:2014-10-23 17:48:38子鼠
日期: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
发表于 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 |显示全部楼层
本帖最后由 本友会机友会摄友会 于 2017-09-14 13:18 编辑

既然只要awk的,那这道题我就不做了。

我只说下思路:
1典型的哈希表套数组的问题。
因为哈希表去重,数组允许重复。

2用那个uid做哈希的【键】,里面有7个【值】。
日期,时间,另一个id,公司名称,用户名+手机号,状态值1,状态值2
ps代码为:

  1. $hash = @{}
  2. $v = 'a','b','c','d','e','f','g'
  3. $hash.add('key',$v)
复制代码

3 行切割成字段,如果不为0,则添加到相关$v的位置。然后遍历下一行,如此类推。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP