免费注册 查看新帖 |

Chinaunix

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

去重复<转> [复制链接]

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
21 [报告]
发表于 2011-09-02 02:47 |只看该作者
本帖最后由 yinyuemi 于 2011-09-02 03:05 编辑

贴下我的吧,呵呵,
  1. awk '
  2. {e=0
  3.    {for(i=1;i<NR;i++)
  4.       if(split("#"gensub(",","##","g",a[i])"#",x,"#"gensub(",","#|#","g",$0)"#")>=6){e=1;break}
  5.    }
  6.    if(!e){a[NR]=$0;print $0}
  7. }'

  8. 使用fucntion还可以简化下:

  9. awk '
  10. function f(a,b){return "#"gensub(",","#"b"#","g",a)"#";}
  11. {e=0
  12.    {for(i=1;i<NR;i++)
  13.       if(split(f(a[i],""),x,f($0,"|"))>=6){e=1;break}
  14.    }
  15.    if(!e){a[NR]=$0;print $0}
  16. }'


复制代码

论坛徽章:
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
22 [报告]
发表于 2011-09-02 08:28 |只看该作者
回复  jason680


思路新颖~
xrzs1986 发表于 2011-09-02 01:57



是的!!

通用性与效能兼具.
(想说在10楼在最底了,
没人看了,没人理.... 效能也没A^3+B^3..好)

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
23 [报告]
发表于 2011-09-02 08:33 |只看该作者
是的!!

通用性与效能兼具.
(想说在10楼在最底了,
没人看了,没人理.... 效能也没A^3+B^3..好)
jason680 发表于 2011-09-02 08:28


如果数据量比较大重复多,好像也没12楼的效能好,也可能是我的数据样品没代表性

论坛徽章:
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
24 [报告]
发表于 2011-09-02 08:43 |只看该作者
本帖最后由 jason680 于 2011-09-02 08:46 编辑
如果数据量比较大重复多,好像也没12楼的效能好,也可能是我的数据样品没代表性
waker 发表于 2011-09-02 08:33


不知,你如何评估效能....

12楼有两个for....
且 l (在第一个for中)会愈来愈大....
for(i=1;i<=l;i++){s=0;for(j=1;j<=NF;

注: 我没测试过....且尚可改善效能(如果有须要)......

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
25 [报告]
发表于 2011-09-02 08:47 |只看该作者
回复 24# jason680


    time出来的

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
26 [报告]
发表于 2011-09-02 08:48 |只看该作者
稍等一会儿我帖一下

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
27 [报告]
发表于 2011-09-02 09:06 |只看该作者

  1. [waker@proxy ~]$ time awk -F, '{s=0;m=1;for(i=1;i<=NF;i++)s+=$i^3;for(i=1;i<=NF;i++)m*=(!a[s-$i^3]++);if(m)print}' file >/dev/null

  2. real    0m16.777s
  3. user    0m13.445s
  4. sys     0m0.471s
  5. [waker@proxy ~]$ time  awk -F, '{for(i=1;i<=l;i++){s=0;for(j=1;j<=NF;j++)if(index(a[i],$j))s++;if(s>=5)next}a[++l]=$0}1' file >/dev/null                        
  6. real    0m25.130s
  7. user    0m22.973s
  8. sys     0m0.486s
  9. [waker@proxy ~]$ time awk -F, '{T="";for(n=0;n++<NF;){T=T","a[$n];a[$n]=a[$n]","NR};split(T,t,",");f=0;for(n in t){if(t[n]=="")continue;if(gsub(t[n],"",T)>=5)f=1};if(f==0)print $0}' file >/dev/null


  10. real    8m34.754s
  11. user    7m46.657s
  12. sys     0m9.780s
  13. [waker@proxy ~]$ wc -l file
  14. 388800 file
复制代码
最后一种方法是我Ctrl-C出来的时间,还一直在算,等不急了

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
28 [报告]
发表于 2011-09-02 09:18 |只看该作者
本帖最后由 yinyuemi 于 2011-09-02 09:24 编辑
  1. for((i=1;i<=1000;i++)); do echo '02,10,11,18,27,30
  2. 06,09,11,14,20,31
  3. 02,10,11,18,27,33
  4. 01,03,04,16,18,22
  5. 07,14,22,27,28,32
  6. 02,10,11,16,18,27
  7. 04,05,09,15,21,30
  8. 12,13,17,20,22,23
  9. 04,05,09,15,21,30' >>testfile; done

  10. wc -l testfile
  11. 9000 testfile

  12. 4#:

  13. time awk -F, '{s=0;m=1;for(i=1;i<=NF;i++)s+=$i^3;for(i=1;i<=NF;i++)m*=(!a[s-$i^3]++);if(m)print}' testfile
  14. 02,10,11,18,27,30
  15. 06,09,11,14,20,31
  16. 01,03,04,16,18,22
  17. 07,14,22,27,28,32
  18. 04,05,09,15,21,30
  19. 12,13,17,20,22,23

  20. real    0m0.154s
  21. user    0m0.154s
  22. sys     0m0.000s

  23. 10#:(ctrl-c 终止程序)
  24. time awk -F, '{T="";for(n=0;n++<NF;){T=T","a[$n];a[$n]=a[$n]","NR};split(T,t,",");f=0;for(n in t){if(t[n]=="")continue;if(gsub(t[n],"",T)>=5)f=1};if(f==0)print $0}' testfile
  25. 02,10,11,18,27,30
  26. 06,09,11,14,20,31
  27. 01,03,04,16,18,22
  28. 07,14,22,27,28,32
  29. 04,05,09,15,21,30
  30. 12,13,17,20,22,23


  31. real    10m20.540s
  32. user    10m18.173s
  33. sys     0m0.982s


  34. 12#:

  35. time awk -F, '{for(i=1;i<=l;i++){s=0;for(j=1;j<=NF;j++)if(index(a[i],$j))s++;if(s>=5)next}a[++l]=$0}1' testfile
  36. 02,10,11,18,27,30
  37. 06,09,11,14,20,31
  38. 01,03,04,16,18,22
  39. 07,14,22,27,28,32
  40. 04,05,09,15,21,30
  41. 12,13,17,20,22,23

  42. real    0m0.128s
  43. user    0m0.127s
  44. sys     0m0.001s


  45. 21#:

  46. time awk '
  47. function f(a,b){return "#"gensub(",","#"b"#","g",a)"#";}
  48. {e=0
  49.    {for(i=1;i<NR;i++)
  50.       if(split(f(a[i],""),x,f($0,"|"))>=6){e=1;break}
  51.    }
  52.    if(!e){a[NR]=$0;print $0}
  53. }' testfile
  54. 02,10,11,18,27,30
  55. 06,09,11,14,20,31
  56. 01,03,04,16,18,22
  57. 07,14,22,27,28,32
  58. 04,05,09,15,21,30
  59. 12,13,17,20,22,23

  60. real    0m0.841s
  61. user    0m0.837s
  62. sys     0m0.001s


  63. 4#waker兄的效率很高,不过适用于数值型数据
  64. 10# 通用性好,不过效率上要差
  65. 12# 如Tim兄所言,数值是2位的,效率很高
  66. 21# 通用性上稍差,如果是文本去重复的,且文本中包含正则符号或","或"#",可能会有问题(10#的代码使用gsub可能也有类似问题,没测试),效率上比4#和12#的要差

复制代码

论坛徽章:
0
29 [报告]
发表于 2011-09-02 09:50 |只看该作者
好贴留名,学习!

论坛徽章:
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
30 [报告]
发表于 2011-09-02 10:02 |只看该作者
本帖最后由 jason680 于 2011-09-02 10:04 编辑
yinyuemi 发表于 2011-09-02 09:18


请问楼主何者正确....
$ cat repeat5a
01,02,03,04,05,06
01,02,03,04,05,07
01,02,03,04,07,09
  1. $ awk -F, '{s=0;m=1;for(i=1;i<=NF;i++)s+=$i^3;for(i=1;i<=NF;i++)m*=(!a[s-$i^3]++);if(m)print}' repeat5a
复制代码
01,02,03,04,05,06
  1. $ awk -F, '{for(i=1;i<=l;i++){s=0;for(j=1;j<=NF;j++)if(index(a[i],$j))s++;if(s>=5)next}a[++l]=$0}1' repeat5a
复制代码
01,02,03,04,05,06
01,02,03,04,07,09
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP