免费注册 查看新帖 |

Chinaunix

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

[awk]数据归类 [复制链接]

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
21 [报告]
发表于 2010-04-01 15:55 |只看该作者
回复 19# springwind426


    分类应该没有错,只是分类编号可能不同。

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
22 [报告]
发表于 2010-04-01 16:45 |只看该作者
回复 19# springwind426


    嗯,算法是有问题。谢谢 springwind426指正!

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
23 [报告]
发表于 2010-04-01 18:17 |只看该作者
本帖最后由 blackold 于 2010-04-01 23:20 编辑

try:

  1. awk '{if(a[$1]+a[$2]==0)a[$1]=a[$2]=++n;else if(a[$1]!=a[$2]){if(a[$1]*a[$2]==0)a[$1]=a[$2]=a[$1]+a[$2];else{min=(a[$1]<a[$2])?a[$1]:a[$2];max=(a[$1]<a[$2])?a[$2]:a[$1];for(i in a)if(a[i]==max)a[i]=min}}}END{for(i in a)print a[i],i}' urfile|sort -n
复制代码
scr.awk

  1. {
  2.   if(a[$1]+a[$2]==0)
  3.     a[$1]=a[$2]=++n
  4.   else if(a[$1]!=a[$2])
  5.   {
  6.     if(a[$1]*a[$2]==0)
  7.       a[$1]=a[$2]=a[$1]+a[$2]
  8.     else
  9.     {
  10.       min=(a[$1]<a[$2])?a[$1]:a[$2]
  11.       max=(a[$1]<a[$2])?a[$2]:a[$1]
  12.       for(i in a) if(a[i]==max)a[i]=min
  13.     }
  14.   }
  15. }
  16. END {
  17.   for(i in a) print a[i],i
  18. }
复制代码
  1. awk -f scr.awk urfile|sort -n
复制代码

论坛徽章:
0
24 [报告]
发表于 2010-04-01 22:15 |只看该作者
try:scr.awk
blackold 发表于 2010-04-01 18:17


结果还是不对,他要求的是只要在前面出现过的,或者是相关联的,就分为一类

比如:
a1  b1
b1  c1
c1  d1
c1  d2
d2  e1

象这样的,都分为一类,因为它们之间有直接关联或者间接关联

而我发现,它的数据中有特殊情况,也无法通过排序来排列,比如

10000040        10000043
10000040        10000044
10000041        10000042
10000041        10000043
10000041        10000044
10000042        10000043
10000042        10000044
10000043        10000044

这一段就很特殊,我开始用一段代码,就发现结果有误,后来发现有这样的数据存在,因此,需要多次扫描,才能保证所有的数据都能够正确归类

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
25 [报告]
发表于 2010-04-01 22:20 |只看该作者
回复 24# springwind426


    我测试的结果没发现错误的地方啊。

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
26 [报告]
发表于 2010-04-01 22:24 |只看该作者
回复 24# springwind426


    这类似于双向指针的数据结构。

    我觉得一次扫描就可以了,排序没有用。

论坛徽章:
0
27 [报告]
发表于 2010-04-01 22:28 |只看该作者
回复  springwind426


    这类似于双向指针的数据结构。

    我觉得一次扫描就可以了,排序没有用 ...
blackold 发表于 2010-04-01 22:24


他给出的他用C语言写的程序的运行结果,他的样本数据只有1521个分类

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
28 [报告]
发表于 2010-04-01 22:32 |只看该作者
回复 27# springwind426


    嗯。没错,验证过了。
    你可以用一楼的几行样本来测试。

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
29 [报告]
发表于 2010-04-01 22:49 |只看该作者
对了,我的分类编号与LZ的不同。

论坛徽章:
0
30 [报告]
发表于 2010-04-01 22:54 |只看该作者
回复  springwind426


    嗯。没错,验证过了。
    你可以用一楼的几行样本来测试。
blackold 发表于 2010-04-01 22:32


是的,我刚验证过了,确实是正确的

相比而言,我的那个代码的算法太差了,运算速度与你的代码差2个数量级

看来还需要加强学习:wink:
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP