免费注册 查看新帖 |

Chinaunix

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

请教脚本高手解决(已解决) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-08-01 22:05 |只看该作者 |倒序浏览
本帖最后由 whuang9527 于 2011-08-02 08:43 编辑

原文件内容:
101082 ; 20 ; 12
101082 ; 5 ; 8
101082 ; 200 ; 8
101082 ; 300 ; 9
101082 ; 200 ; 18
101082 ; 150 ; 19
101082 ; 100 ; 5
101082 ; 100 ; 15
101082 ; 100 ; 4
101082 ; 100 ; 14
101083 ; 300 ; 9
101083 ; 150 ; 19
101083 ; 200 ; 8
101083 ; 200 ; 18
101083 ; 150 ; 5
101083 ; 150 ; 15
101084 ; 1 ; 15
101084 ; 100 ; 5
101084 ; 200 ; 15
101084 ; 200 ; 8
101084 ; 300 ; 9
101084 ; 200 ; 18
101085 ; 50 ; 2
101085 ; 150 ; 5
101085 ; 150 ; 12
101085 ; 50 ; 15
101085 ; 100 ; 5
101085 ; 200 ; 15
101085 ; 10 ; 8
101085 ; 10 ; 13
101085 ; 5 ; 19
101085 ; 5 ; 19
101085 ; 50 ; 2
101085 ; 5 ; 4
101085 ; 5 ; 5
101085 ; 5 ; 14
101085 ; 10 ; 2
101085 ; 10 ; 6
101085 ; 50 ; 8
101085 ; 10 ; 12
101085 ; 30 ; 16

需要转换为以下内容
101082 0 0 0 100 100 0 0 205 300 0 0 20 0 100 100 0 0 200 150 0
101083 0 0 0 0 150 0 0 200 300 0 0 0 0 0 150 0 0 200 150 0
101084 0 0 0 0 100 0 0 200 300 0 0 0 0 0 201 0 0 200 0 0
101085 0 100 0 5 255 10 0 60 0 0 0 160 10 5 250 30 0 0 10 0

其中,第一列内容是数据库中的主键,第三列代表该数字的位置(一共有20个位置,比如数字5就放置到后面的第5列),如果第一列和第二列相同的话,则第三列数量相加,没有的数量以0补充。
最近学习awk,发现其功能真强大,但是数组这一块感觉很难领会,希望高手能不吝赐教,如何解法?

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
2 [报告]
发表于 2011-08-01 22:20 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2011-08-01 22:26 |只看该作者
数据太大,我摘了一部分。结果文档是我手工算出来的(因为不知道解法)。
比如第2,3条记录101082 ; 5 ; 8
101082 ; 200 ; 8
可以这样认为,将数字8放到第(8+1)列,存入的数字是5+200=205,第一列是主键不变,没有的内容都填0.
继续等高手。

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

回复 1# whuang9527
  1. awk -F' ; ' '{a[$1" "$3]+=$2;b[$1]}END{for(j in b){printf j;for(i=1;i<=20;i++) printf a[j" "i]?" "a[j" "i]:" 0";printf "\n"}}' urfile
  2. 101082 0 0 0 100 100 0 0 205 300 0 0 20 0 100 100 0 0 200 150 0
  3. 101083 0 0 0 0 150 0 0 200 300 0 0 0 0 0 150 0 0 200 150 0
  4. 101084 0 0 0 0 100 0 0 200 300 0 0 0 0 0 201 0 0 200 0 0
  5. 101085 0 110 0 5 255 10 0 60 0 0 0 160 10 5 250 30 0 0 10 0
复制代码

论坛徽章:
0
5 [报告]
发表于 2011-08-02 08:43 |只看该作者
多谢上面这位仁兄

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
6 [报告]
发表于 2011-08-02 08:59 |只看该作者
awk的数组就是一个散列表,应该不难理解吧

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
7 [报告]
发表于 2011-08-02 12:08 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
8 [报告]
发表于 2011-08-02 14:44 |只看该作者
本帖最后由 ywlscpl 于 2011-08-02 14:47 编辑
  1. ywlscpl@ubuntu:~$ awk -F '[ ;]+' '{a[$1","$3]+=$2}$3>max[$1]{max[$1]=$3}END{for (i in max) {printf i;for (j=1;j<=max[i];j++) printf " "(i","j in a?a[i","j]:0);print ""}}' file
  2. 101082 0 0 0 100 100 0 0 205 300 0 0 20 0 100 100 0 0 200 150
  3. 101083 0 0 0 0 150 0 0 200 300 0 0 0 0 0 150 0 0 200 150
  4. 101084 0 0 0 0 100 0 0 200 300 0 0 0 0 0 201 0 0 200
  5. 101085 0 110 0 5 255 10 0 60 0 0 0 160 10 5 250 30 0 0 10
复制代码
没看到是固定20列的,固定20列答案就是4楼的,没啥写的了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP