免费注册 查看新帖 |

Chinaunix

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

[文本处理] 求助,请教大神awk计算问题 [复制链接]

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
21 [报告]
发表于 2018-12-11 19:08 |只看该作者
回复 20# hsinxx


<<<awk3.0
  1. cat 1
  2. 56055|10|1|11
  3. 56055|20|2|8
  4. 56055|30|3|5
  5. 56055|40|4|3
  6. 56055|50|5|1
  7. 56056|60|6|3
  8. 56057|70|7|1
  9. 56058|80|8|2
  10. 56058|90|9|2

  11. awk -F"|" 'function p(){if(length(d)>2){for(i=0;i<length(d);i++){for(j=1;j<=e[i]-e[i+1];j++){h[++k]=d[i]}};for(m=length(h);m>0;m--){n[b]=n[b]?n[b]","h[m]:h[m]};print b"|"c[b]"|"n[b]"|"f[b]}else{print g[b]};delete d;delete e;delete h;a=k=0}{if(!s[$1]++&&NR>1){p()};++a;b=$1;c[b]+=$2;d[a]=d[a-1]+$3;e[a]=$4;f[b]=f[b]>$4?f[b]:$4;g[b]=$0}END{p()}' 1
  12. 56055|150|15,10,10,6,6,3,3,3,1,1,1|11
  13. 56056|60|6|3
  14. 56057|70|7|1
  15. 56058|170|17,17|2
复制代码

论坛徽章:
0
22 [报告]
发表于 2018-12-12 11:43 |只看该作者
回复 21# wh7211

大神,计算还是有问题

db_ndmc11:/root/dyx # cat >test.unl
980618|2000|1000|2
980618|1000|1000|1
980618|1657|1000|1
980618|2000|1000|2
980618|2000|1000|2
980618|2000|1000|2
980618|2000|1000|2
980618|2000|1000|2
980618|2000|1000|2
980618|2000|1000|2
980618|2000|1000|2
980618|2000|1000|2
980618|2000|1000|2
980618|2000|1000|2
980618|2000|1000|2
456038|27500|2500|11
456038|5000|2500|2
db_ndmc11:/root/dyx # awk -F"|" 'function p(){if(length(d)>2){for(i=0;i<length(d);i++){for(j=1;j<=i]-e[i+1];j++){h[++k]=d}};for(m=length(h);m>0;m--){n=n?n","h[m]:h[m]};print b"|"c"|"n"|"f}else{print g};delete d;delete e;delete h;a=k=0}{if(!s[$1]++&&NR>1){p()};++a;b=$1;c+=$2;d[a]=d[a-1]+$3;e[a]=$4;f=f>$4?f4;g=$0}END{p()}' test.unl            
980618|28657|15000,15000,1000|2
456038|32500|5000,5000,2500,2500,2500,2500,2500,2500,2500,2500,2500|11   



980618|28657|15000,15000,1000|2    ### 这行输出应该是 980618|28657|15000,13000|2

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
23 [报告]
发表于 2018-12-12 12:22 |只看该作者
本帖最后由 wh7211 于 2018-12-12 13:17 编辑

回复 22# hsinxx


13楼的描述:结果文件$3的计算规则,根据$4的值计算,$1相同的行,$4的值为多少,$3就相加几次。如第一行为数据$4为1、第二行为数据$4为3,第三行为数据$4为5。那$3第一列的值就为三行$3数据相加,第二列值为二、三行$3数据相加,第三列值为二、三行$3数据相加,第四、五列值之间打印第三行$3的值。

13楼,$1相同的记录有3行,输出结果中$3是5列

22楼的描述:### 这行输出应该是 980618|28657|15000,13000|2

22楼,$1为980618的记录有15行,输出结果中$3却只有2列

又回到需求描述的问题。这样吧,你把下面的输出写出来,然后给出输出中$3的排列规则,比如:谁和谁相加?重复几次?一共列出多少成员?
  1. 56055|10|1|11
  2. 56055|20|2|8
  3. 56055|30|3|5
  4. 56055|40|4|2
  5. 56055|50|5|2
  6. 56055|60|6|2
  7. 56055|70|7|5
  8. 56055|80|8|2
  9. 56055|90|9|2
复制代码

评分

参与人数 1信誉积分 +30 收起 理由
hsinxx + 30 很给力!

查看全部评分

论坛徽章:
0
24 [报告]
发表于 2018-12-12 15:19 |只看该作者
回复 23# wh7211

  1. 56055|10|1|11
  2. 56055|20|2|8
  3. 56055|30|3|5
  4. 56055|40|4|2
  5. 56055|50|5|2
  6. 56055|60|6|2
  7. 56055|70|7|5
  8. 56055|80|8|2
  9. 56055|90|9|2


  10. 结果文件
  11. 56055|450|45,45,13,13,13,3,3,3,1,1,1|11
复制代码

上面$1相同数据有9行,$4最大是为11,结果文件的$3应该输出11列数据。$3第一列值为$4>=1的$3数据相加,$3第二列值为$4>=2的$3数据相加,$3第三列值为$4>=3的$3数据相加,$3第四列值为$4>=4的$3数据相加,$3第五列值为$4>=5的$3数据相加,以此类推知道11列数据打印问。

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
25 [报告]
发表于 2018-12-12 18:19 |只看该作者
本帖最后由 wh7211 于 2018-12-12 18:29 编辑

回复 24# hsinxx


上面$1相同数据有9行,$4最大是为11,结果文件的$3应该输出11列数据。$3第一列值为$4>=1的$3数据相加,$3第二列值为$4>=2的$3数据相加,$3第三列值为$4>=3的$3数据相加,$3第四列值为$4>=4的$3数据相加,$3第五列值为$4>=5的$3数据相加,以此类推知道11列数据打印问。
  1. cat 1
  2. 56055|10|1|11
  3. 56055|20|2|8
  4. 56055|30|3|5
  5. 56055|40|4|2
  6. 56055|50|5|2
  7. 56055|60|6|2
  8. 56055|70|7|5
  9. 56055|80|8|2
  10. 56055|90|9|2
  11. 56056|60|6|3
  12. 56057|70|7|1
  13. 56058|80|8|2
  14. 56058|90|9|2
  15. 980618|2000|1000|2
  16. 980618|1000|1000|1
  17. 980618|1657|1000|1
  18. 980618|2000|1000|2
  19. 980618|2000|1000|2
  20. 980618|2000|1000|2
  21. 980618|2000|1000|2
  22. 980618|2000|1000|2
  23. 980618|2000|1000|2
  24. 980618|2000|1000|2
  25. 980618|2000|1000|2
  26. 980618|2000|1000|2
  27. 980618|2000|1000|2
  28. 980618|2000|1000|2
  29. 980618|2000|1000|2
  30. 456038|27500|2500|11
  31. 456038|5000|2500|2
复制代码


<<<保持源文件行记录顺序
  1. awk -F"|" '{++a[$1];b[$1]+=$2;c[$1""a[$1]]=$3;d[$1""a[$1]]=$4;e[$1]=e[$1]>$4?e[$1]:$4;f[$1]=$0;g[$1]=NR;h[NR]=$1}END{asort(g,m);for(i in m){n=h[m[i]];if(a[n]>1){for(j=1;j<=e[n];j++){for(k=1;k<=a[n];k++){if(d[n""k]>=j){p[n""j]+=c[n""k]}};q[n]=q[n]?q[n]","p[n""j]:p[n""j]};print n"|"b[n]"|"q[n]"|"e[n]}else{print f[n]}}}' 1
  2. 56055|450|45,45,13,13,13,3,3,3,1,1,1|11
  3. 56056|60|6|3
  4. 56057|70|7|1
  5. 56058|170|17,17|2
  6. 980618|28657|15000,13000|2
  7. 456038|32500|5000,5000,2500,2500,2500,2500,2500,2500,2500,2500,2500|11
复制代码


<<<默认方式排序
  1. awk -F"|" '{++a[$1];b[$1]+=$2;c[$1""a[$1]]=$3;d[$1""a[$1]]=$4;e[$1]=e[$1]>$4?e[$1]:$4;f[$1]=$0}END{for(i in e){if(a[i]>1){for(j=1;j<=e[i];j++){for(k=1;k<=a[i];k++){if(d[i""k]>=j){g[i""j]+=c[i""k]}};h[i]=h[i]?h[i]","g[i""j]:g[i""j]};print i"|"b[i]"|"h[i]"|"e[i]}else{print f[i]}}}' 1
  2. 56055|450|45,45,13,13,13,3,3,3,1,1,1|11
  3. 56056|60|6|3
  4. 56057|70|7|1
  5. 56058|170|17,17|2
  6. 456038|32500|5000,5000,2500,2500,2500,2500,2500,2500,2500,2500,2500|11
  7. 980618|28657|15000,13000|2
复制代码

评分

参与人数 1信誉积分 +50 收起 理由
hsinxx + 50 很给力!

查看全部评分

论坛徽章:
0
26 [报告]
发表于 2018-12-13 10:17 |只看该作者
回复 25# wh7211

OK了,谢谢大神抽查宝贵时间的帮助。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP