免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-31 15:32 |只看该作者 |倒序浏览
本帖最后由 orctyr 于 2010-03-31 16:07 编辑

我有一组大约10万行的数据,如下:
10000001        10000003
10000001        10000006
10000006        10000003
10000004        10000006
10000020        10000021
10000005        10000007
10000008        10000005
10000005        10000009
10000016        10000017
10000023        10000024
10000023        10000025
10000024        10000025
。。。。。。

每一行的两个数据是相关联的,不同行中的相同数据也是相关联的,我需要将它们归总在一起,得到的结果如下:
1        10000001
1        10000003
1        10000006
1        10000004
2        10000005
2        10000007
2        10000008
2        10000009
3        10000016
3        10000017
4        10000020
4        10000021
5        10000023
5        10000024
5        10000025

补充:比如第一行是“10000001        10000003”,那么这两个数是一组,以后出现任意一个含有这两个数的行,另外一个数据也可归在一起(“10000001        10000006”),此时10000001        10000003 10000006是一组。
处理之前先排序也是可以的,但是效果不明显。

论坛徽章:
0
2 [报告]
发表于 2010-03-31 15:47 |只看该作者
回复 1# orctyr

没什么规历吗?

论坛徽章:
0
3 [报告]
发表于 2010-03-31 15:54 |只看该作者
完全看不懂。。强大!

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
4 [报告]
发表于 2010-03-31 15:59 |只看该作者
眼拙,看不错规律。

论坛徽章:
0
5 [报告]
发表于 2010-03-31 16:06 |只看该作者
  1. awk '!($1 in a)&&!($2 in a){for (i in a) print n,i;n++;delete a}{a[$1];a[$2]}END{for (i in a) print n,i}' file | sort -k1,1n -k2,2n
复制代码

论坛徽章:
0
6 [报告]
发表于 2010-03-31 16:16 |只看该作者
这规律太强大了。

论坛徽章:
0
7 [报告]
发表于 2010-03-31 16:29 |只看该作者
回复 5# ywlscpl
测试了一个4000行的数据,发现存在问题。附件中:比如10004895这个数出现在了两个不同组中。还有一些其他不对的地方。 test.tar.gz (48.29 KB, 下载次数: 59)
其中out.txt是我用c写的脚本得到的结果(速度极慢,不过是正确的)

论坛徽章:
0
8 [报告]
发表于 2010-03-31 16:34 |只看该作者
回复 7# orctyr


    5楼的依赖于同组的是连续的

1 3
2 3
1 4
7 8

后面不会再出现第1组中的数据如2 4

论坛徽章:
0
9 [报告]
发表于 2010-03-31 23:00 |只看该作者
试试:
  1. awk 'BEGIN{t=1;a[0]=1;b=1}{for(i=1;i<length(a);i++){if(index(a[i],$1)){a[i]=a[i]"\n"i"\t"$2;b=0}else{if(index(a[i],$2)){a[i]=a[i]"\n"i"\t"$1;b=0}else{b=1}}};if(b==1){a[t]=t"\t"$1"\n"t"\t"$2;t++}}END{for(j=1;j<length(a);j++){print a[j]}}' data |sort -u
复制代码

论坛徽章:
0
10 [报告]
发表于 2010-04-01 09:19 |只看该作者
怎么都流行单行脚本啊。。。。。脚本不一定非得写成一行啊。。。写的行多反倒比较好理解。好修正
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP