免费注册 查看新帖 |

Chinaunix

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

[文本处理] shell去重 合并 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-01-15 10:22 |只看该作者 |倒序浏览
本帖最后由 cerberus43 于 2014-01-15 10:41 编辑

需求: 根据第二列 以及第五列判断
         如果此两列相同,合并第一列以及第四列(已逗号分隔)(第三列时间不用管)

源文件:
        123456|TX|18:10:57|1.2.3.4|gateway2
        123456|TX|18:11:58|1.2.3.5|gateway2
        123455|QQ|18:10:57|1.2.3.6|gateway
        123454|QQ|18:11:58|1.2.3.4|gateway


目标:
       123456|TX|18:10:57|1.2.3.4,1.2.3.5|gatway2
       123455,123454|QQ|18:10:57|1.2.3.6,1.2.3.4|gateway


这里先谢谢各位大神
求指点

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
2 [报告]
发表于 2014-01-15 10:29 |只看该作者
楼主说的, 好象跟给的例子不一致. 能不能重新整理一下你的想法, 再仔细看看你写的内容, 重新发一下 ?

论坛徽章:
0
3 [报告]
发表于 2014-01-15 10:42 |只看该作者
啊 写错了  已经重新编辑了  谢谢指点 应该是根据第二列 和第五列 判断  合并第一列  第四列回复 2# q1208c


   

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
4 [报告]
发表于 2014-01-15 10:58 |只看该作者
  1. [root@everIover ~]# awk -F"|" '{if(!t[$1$2$5])a[$2$5]=a[$2$5]?a[$2$5]","$1:$1;t[$1$2$5]++;b[$2$5]=b[$2$5]?b[$2$5]","$4:$4;c[$2$5]=c[$2$5]?c[$2$5]:$2;d[$2$5]=d[$2$5]?d[$2$5]:$3;e[$2$5]=e[$2$5]?e[$2$5]:$5;}END{for(i in a)print a[i]"|"c[i]"|"d[i]"|"b[i]"|"e[i]}' i
  2. 123456|TX|18:10:57|1.2.3.4,1.2.3.5|gateway2
  3. 123455,123454|QQ|18:10:57|1.2.3.6,1.2.3.4|gateway
  4. [root@everIover ~]# cat i
  5. 123456|TX|18:10:57|1.2.3.4|gateway2
  6. 123456|TX|18:11:58|1.2.3.5|gateway2
  7. 123455|QQ|18:10:57|1.2.3.6|gateway
  8. 123454|QQ|18:11:58|1.2.3.4|gateway
复制代码
看看对不对 ,不对再改

论坛徽章:
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
5 [报告]
发表于 2014-01-15 11:00 |只看该作者
  1. $ awk 'BEGIN{FS=OFS="|"}{t=$2" "$5;if(!a[t]++){b[++n]=t;c[t]=$3}for(i=1;i<NF;i+=3)if(!d[t,$i]++)e[t,i]=e[t,i]!=""?e[t,i]","$i:$i}END{for(i=0;i++<n;){split(b[i],f," ");print e[b[i],1],f[1],c[b[i]],e[b[i],4],f[2]}}' i
  2. 123456|TX|18:10:57|1.2.3.4,1.2.3.5|gateway2
  3. 123455,123454|QQ|18:10:57|1.2.3.6,1.2.3.4|gateway
复制代码

论坛徽章:
0
6 [报告]
发表于 2014-01-15 11:08 |只看该作者
谢大神! OK 回复 4# 这个冬天不冷


   

论坛徽章:
0
7 [报告]
发表于 2014-01-15 11:08 |只看该作者
谢大神! OK 回复 5# yestreenstars


   

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
8 [报告]
发表于 2014-01-15 11:31 |只看该作者
楼上两位的算法在数据里小的时候是没问题的, 当数据量很大的时候, 怕是 ... ... OOM 了吧?

建议先按 第二列 对文件排序, 然后就会简单很多, 只要判断$2 是不是跟前面的相同就行了

论坛徽章:
7
亥猪
日期:2013-10-10 17:00:29辰龙
日期:2013-10-12 16:23:19卯兔
日期:2013-11-18 17:01:27金牛座
日期:2014-09-09 10:17:052015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之柏太阳神
日期:2015-09-25 13:56:42数据库技术版块每日发帖之星
日期:2016-08-06 06:20:00
9 [报告]
发表于 2014-01-15 11:32 |只看该作者
本帖最后由 li0924 于 2014-01-15 11:48 编辑

若源文件是这样的话;还可以这样
  1. awk 'BEGIN{FS=OFS="|"}{getline d;split(d,a,"|");if($2==a[2] && $5==a[5]){$1=($1==a[1])?$1:$1","a[1];$4=($4==a[4])?$4:$4","a[4]}}1' FILE
  2. 123456|TX|18:10:57|1.2.3.4,1.2.3.5|gateway2
  3. 123455,123454|QQ|18:10:57|1.2.3.6,1.2.3.4|gateway
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP