免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-01 12:55 |显示全部楼层 |倒序浏览
本帖最后由 yinyuemi 于 2011-09-02 01:28 编辑

文本:

02,10,11,18,27,30
06,09,11,14,20,31
02,10,11,18,27,33
01,03,04,16,18,22
07,14,22,27,28,32
02,10,11,16,18,27
04,05,09,15,21,30
12,13,17,20,22,23
04,05,09,15,21,30

去重复的规则:

02,10,11,18,27,30
06,09,11,14,20,31
02,10,11,18,27,33(和第1条重复5个,去掉)
01,03,04,16,18,22
07,14,22,27,28,32
02,10,11,16,18,27(和第1条重复5个,去掉)
04,05,09,15,21,30
12,13,17,20,22,23
04,05,09,15,21,30(和倒数3条重复6个,去掉)


输出结果:

02,10,11,18,27,30
06,09,11,14,20,31
01,03,04,16,18,22
07,14,22,27,28,32
04,05,09,15,21,30
12,13,17,20,22,23

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
2 [报告]
发表于 2011-09-01 13:31 |显示全部楼层
回复 2# liion631818


    恩,是这个意思

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
3 [报告]
发表于 2011-09-01 13:56 |显示全部楼层
回复 6# mpstat


    应该是排好序的,每行都是从小到大的

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
4 [报告]
发表于 2011-09-01 13:58 |显示全部楼层
回复 4# waker


    老大,这个太猛了!

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
5 [报告]
发表于 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. }'


复制代码

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
6 [报告]
发表于 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#的要差

复制代码

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
7 [报告]
发表于 2011-09-02 10:42 |显示全部楼层
回复 30# jason680


    好问题!
   因为我是转贴,所以也并不完全明白去重复的规则,
   我的理解,如果是你提供的那个数据,我觉得第二个是对的,
   
   不过,如果数据的顺序不同,结果有可能也会不同,的确很纠缠,可以不去讨论细节了,
   大家解决问题的思路都值得学习!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP