免费注册 查看新帖 |

Chinaunix

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

[文本处理] 再问一个升级版的多列排序去重的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-05-09 21:08 |只看该作者 |倒序浏览
有如下文本:
111.7.161.9 111.7.161.5 111.7.161.3 111.7.161.7 - hebeiyd
122.141.231.231 - heilongjianglt
111.40.197.24 111.40.197.23 - heilongjiangyd
111.7.161.5 111.7.161.7 111.7.161.9 111.7.161.3 - henanyd
180.97.153.148 - hubeidx
27.221.6.137 27.221.6.131 27.221.6.133 27.221.6.135 - hubeilt
117.144.232.3 117.144.232.5 117.144.232.7 117.144.232.9 - hubeiyi
119.147.41.33 - hunandx
183.95.87.1 153.37.233.1 - hunanlt
183.232.27.131 183.232.27.135 183.232.27.133 183.232.27.137 - hunanyd
221.204.166.7 221.204.166.5 221.204.166.9 221.204.166.3 - jiangsult
117.144.232.5 117.144.232.3 117.144.232.7 117.144.232.9 - jiangsuyd
36.248.21.1 153.37.233.1 - jiangxilt
183.232.27.133 183.232.27.137 183.232.27.131 183.232.27.135 - jiangxiyd
59.47.79.226 - jilindx
122.141.231.231 122.141.231.233 122.141.231.227 122.141.231.229 - jilinlt
111.26.20.102 111.26.20.115 111.26.20.113 111.26.20.109 111.26.20.111 111.26.20.103 - jilinyd
59.47.79.226 - liaoningdx
61.189.0.7 61.189.0.9 61.189.0.3 61.189.0.5 - liaoninglt
111.13.141.5 111.13.141.9 111.13.141.3 111.13.141.7 - liaoningyd
42.81.26.2 - neimenggudx
122.141.231.229 122.141.231.231 122.141.231.227 122.141.231.233 - neimenggult
120.193.146.110 - neimengguyd
61.185.45.3 - ningxiadx
221.204.166.9 221.204.166.3 221.204.166.7 221.204.166.5 - ningxialt
111.7.161.3 111.7.161.5 111.7.161.7 111.7.161.9 - ningxiayd
61.185.45.3 - qinghaidx
27.221.6.131 27.221.6.137 27.221.6.135 27.221.6.133 - qinghailt
111.12.251.174 111.12.251.176 - qinghaiyd
42.81.26.2 - shandongdx
60.217.235.175 - shandongjn
223.99.250.155 - shandongyd
221.204.166.7 221.204.166.9 221.204.166.3 221.204.166.5 - shanghailt
117.144.106.45 - shanghaiyd
221.204.166.3 221.204.166.5 221.204.166.7 221.204.166.9 - shanxi1lt
111.7.161.7 111.7.161.3 111.7.161.5 111.7.161.9 - shanxi1yd
221.204.166.7 221.204.166.3 221.204.166.9 221.204.166.5 - shanxi3lt
111.7.161.5 111.7.161.3 111.7.161.7 111.7.161.9 - shanxi3yd
119.84.68.68 - sichuandx
117.177.240.39 117.177.240.64 117.177.240.40 117.177.240.37 117.177.240.38 - sichuanyd
42.81.26.2 - tianjingdx
111.13.141.7 111.13.141.9 111.13.141.3 111.13.141.5 - tianjingyd
61.185.45.3 - xinjiangdx
221.204.166.7 221.204.166.3 221.204.166.5 221.204.166.9 - xinjianglt
111.13.141.9 111.13.141.3 111.13.141.7 111.13.141.5 - xinjiangyd


IP的列数不固定,IP的顺序不一样,
我想将IP去重,不考虑IP行的顺序,比如下面2行就是重复的,重复的把最后一列累计并排写后面

221.204.166.7 221.204.166.9 221.204.166.3 221.204.166.5 - shanghailt
221.204.166.3 221.204.166.5 221.204.166.7 221.204.166.9 - shanxi1lt
比如上面2行重复的处理后的结果是 :

221.204.166.7 221.204.166.9 221.204.166.3 221.204.166.5 - shanghailt shanxi1lt


谢了各位

论坛徽章:
54
2015亚冠之德黑兰石油
日期:2015-07-07 13:00:1615-16赛季CBA联赛之深圳
日期:2016-03-31 09:03:5415-16赛季CBA联赛之辽宁
日期:2016-05-09 20:38:15程序设计版块每日发帖之星
日期:2016-05-12 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-13 15:19:4715-16赛季CBA联赛之福建
日期:2016-05-15 20:24:34每日论坛发贴之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之吉林
日期:2016-05-26 11:49:4715-16赛季CBA联赛之广东
日期:2016-05-26 13:49:18极客徽章
日期:2016-12-07 14:05:2315-16赛季CBA联赛之广夏
日期:2016-12-20 17:33:532017金鸡报晓
日期:2017-01-10 15:19:56
2 [报告]
发表于 2016-05-09 21:24 |只看该作者
  1. result = {}

  2. with open("file") as f:
  3.     for i in f:
  4.         if "-" in i:
  5.             result.setdefault(tuple(sorted(i.split("-")[0].split())),[]).append(i.split("-")[-1].strip())

  6. for i in result:
  7.     print "%s - %s" % (" ".join(i), " ".join(result[i]))
复制代码

论坛徽章:
4
程序设计版块每日发帖之星
日期:2015-10-14 06:20:00每日论坛发贴之星
日期:2015-10-14 06:20:00程序设计版块每日发帖之星
日期:2016-05-02 06:20:00程序设计版块每日发帖之星
日期:2016-05-08 06:20:00
3 [报告]
发表于 2016-05-09 21:26 |只看该作者
本帖最后由 mswsg 于 2016-05-09 21:30 编辑

顶顶楼上,我就不会打了。
不知道楼主考虑好了?这就是你想要的格式?
我猜,这样的格式会不会更好,
一个IP一行,后边跟着不同的地点()回复 2# haooooaaa


   

论坛徽章:
54
2015亚冠之德黑兰石油
日期:2015-07-07 13:00:1615-16赛季CBA联赛之深圳
日期:2016-03-31 09:03:5415-16赛季CBA联赛之辽宁
日期:2016-05-09 20:38:15程序设计版块每日发帖之星
日期:2016-05-12 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-13 15:19:4715-16赛季CBA联赛之福建
日期:2016-05-15 20:24:34每日论坛发贴之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之吉林
日期:2016-05-26 11:49:4715-16赛季CBA联赛之广东
日期:2016-05-26 13:49:18极客徽章
日期:2016-12-07 14:05:2315-16赛季CBA联赛之广夏
日期:2016-12-20 17:33:532017金鸡报晓
日期:2017-01-10 15:19:56
4 [报告]
发表于 2016-05-09 21:39 |只看该作者
本帖最后由 haooooaaa 于 2016-05-09 21:50 编辑
  1. awk -F'[ -]+' 'function x(){asorti(a,b);s="";for(i in b)s=s b[i]" ";delete a}NF{for(i=1;i<NF;i++)a[$i];x();q[s]=(s in q)?q[s]" "$NF:$NF}END{for(i in q)print i"- "q[i]}'
复制代码

论坛徽章:
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
5 [报告]
发表于 2016-05-09 22:23 |只看该作者
本帖最后由 jason680 于 2016-05-09 22:25 编辑

回复 1# 哭过的天空

$ awk 'function x(s, t,n,r){split(s,_x,FS);t=asort(_x);for(n=1;n<=t;++n)r=r _x[n]" ";return(r)}{v=$NF;NF-=2;k=x($0);if(!d[k]++)b[++c]=k;a[k]=a[k]v" "}END{for(n=1;n<=c;++n)print b[n]"- "a[b[n]]}' FILE
111.7.161.3 111.7.161.5 111.7.161.7 111.7.161.9 - hebeiyd henanyd ningxiayd shanxi1yd shanxi3yd
122.141.231.231 - heilongjianglt
...
119.84.68.68 - sichuandx
117.177.240.37 117.177.240.38 117.177.240.39 117.177.240.40 117.177.240.64 - sichuanyd

   

论坛徽章:
0
6 [报告]
发表于 2016-05-09 23:05 |只看该作者
awk -F' - ' '{split($1,a," ");asort(a,b);for(i=1;i<=length(b);i++){sep=" ";if(i==1){sep=""};key=key""sep""b[i]};c[key]=c[key]" "$2;key=""}END{for(i in c){print i" "c[i]}}' FILE

论坛徽章:
30
申猴
日期:2014-04-10 09:43:532015年亚洲杯纪念徽章
日期:2015-03-20 14:40:232015亚冠之阿尔纳斯尔
日期:2015-06-02 18:59:042015亚冠之阿尔希拉尔
日期:2015-06-30 15:22:572015亚冠之大阪钢巴
日期:2015-07-20 10:44:332015亚冠之阿尔纳斯尔
日期:2015-10-28 14:57:5215-16赛季CBA联赛之新疆
日期:2015-12-25 10:18:45黑曼巴
日期:2016-06-26 21:39:5315-16赛季CBA联赛之山西
日期:2016-07-25 21:54:2715-16赛季CBA联赛之北京
日期:2016-10-27 12:07:2315-16赛季CBA联赛之八一
日期:2017-07-07 16:39:0915-16赛季CBA联赛之吉林
日期:2017-09-04 12:14:43
7 [报告]
发表于 2016-05-09 23:33 |只看该作者
  1. awk '{if(NR==1) {a[$0];next} s=0;for ( j in a) {p=0;l=split(j,c);for (i=1;i<NF-1;i++) {for (k=1;k<l-1;k++) if($i==c[k]) p++} if(NF-2==p) {a[j" "$NF];delete a[j];s=1}} if(s==0) {a[$0]}}END{for(i in a) print i}' file
复制代码
回复 1# 哭过的天空


   

求职 : 技术支持/维
论坛徽章:
0
8 [报告]
发表于 2016-05-10 07:25 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
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
9 [报告]
发表于 2016-05-10 11:54 |只看该作者
  1. perl -e 'BEGIN{$re=qr/(.*) - (.*)/}{map {m/$re/;$c1 eq $1?print s/$c1 -//r:do{$c1=$1;print "\n$c1 - $2"}} sort map {@a=m/$re/g;$_=join(" ",sort split " ",$a[0])." - $a[-1]"} <>}' f
复制代码
111.12.251.174 111.12.251.176 - qinghaiyd
111.13.141.3 111.13.141.5 111.13.141.7 111.13.141.9 - liaoningyd tianjingyd xinjiangyd
111.26.20.102 111.26.20.103 111.26.20.109 111.26.20.111 111.26.20.113 111.26.20.115 - jilinyd
111.40.197.23 111.40.197.24 - heilongjiangyd
111.7.161.3 111.7.161.5 111.7.161.7 111.7.161.9 - hebeiyd henanyd ningxiayd shanxi1yd shanxi3yd
117.144.106.45 - shanghaiyd
117.144.232.3 117.144.232.5 117.144.232.7 117.144.232.9 - hubeiyi jiangsuyd
117.177.240.37 117.177.240.38 117.177.240.39 117.177.240.40 117.177.240.64 - sichuanyd
119.147.41.33 - hunandx
119.84.68.68 - sichuandx
120.193.146.110 - neimengguyd
122.141.231.227 122.141.231.229 122.141.231.231 122.141.231.233 - jilinlt neimenggult
122.141.231.231 - heilongjianglt
153.37.233.1 183.95.87.1 - hunanlt
153.37.233.1 36.248.21.1 - jiangxilt
180.97.153.148 - hubeidx
183.232.27.131 183.232.27.133 183.232.27.135 183.232.27.137 - hunanyd jiangxiyd
221.204.166.3 221.204.166.5 221.204.166.7 221.204.166.9 - jiangsult ningxialt shanghailt shanxi1lt shanxi3lt xinjianglt
223.99.250.155 - shandongyd
27.221.6.131 27.221.6.133 27.221.6.135 27.221.6.137 - hubeilt qinghailt
42.81.26.2 - neimenggudx shandongdx tianjingdx
59.47.79.226 - jilindx liaoningdx
60.217.235.175 - shandongjn
61.185.45.3 - ningxiadx qinghaidx xinjiangdx
61.189.0.3 61.189.0.5 61.189.0.7 61.189.0.9 - liaoninglt

论坛徽章:
0
10 [报告]
发表于 2016-05-10 14:59 |只看该作者
非常感谢各位:) shell的,python的,perl的都全啦:)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP