免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2018-12-04 16:11 |只看该作者 |倒序浏览
本帖最后由 hsinxx 于 2018-12-04 16:28 编辑

有如下数据
56038|27500|2500|11
56038|5000|2500|2
56039|25000|2500|10
56039|5000|2500|2
56041|24000|2000|12
56041|4500|1500|3


需要输出结果文件
56038|32500|5000,5000,2500,2500,2500,2500,2500,2500,2500,2500,2500|
56039|30000|5000,5000,2500,2500,2500,2500,2500,2500,2500,2500|
56041|28500|3500,3500,3500,2000,2000,2000,2000,2000,2000,2000,2000,2000|

$1相同时$2相加,$3根据$4的分别相加,如1、2行$4分别为11,2,那结果文件以,分隔符的前两列就是1、2行$3相加,后9列直接打印第一行的$3数据。


请大神帮看一下,这怎么实现!,谢谢

论坛徽章:
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
2 [报告]
发表于 2018-12-04 17:29 |只看该作者
回复 1# hsinxx


  1. awk 'BEGIN{FS=OFS="|"}{a[$1]+=$2;b[$1]+=$3;if(!c[$1]++){d=$3;e1=$4}else{e2=$4;for(i=1;i<=e2;i++){f[$1]=f[$1]?f[$1]","b[$1]:b[$1]};for(i=1;i<=e1-e2;i++){g[$1]=g[$1]?g[$1]","d:d}};}END{for(i in a){print i,a[i],f[i]","g[i]"|"}}' file
复制代码

论坛徽章:
0
3 [报告]
发表于 2018-12-05 10:11 |只看该作者
谢谢大神,真给力,解决我的难题

论坛徽章:
0
4 [报告]
发表于 2018-12-05 10:31 |只看该作者
回复 2# wh7211

大神,如果$1没有相同的也需要打印出来呢。还有$4打印$1相同的最大值。
如下
56038|27500|2500|11
56038|5000|2500|2
56039|25000|2500|10
56039|5000|2500|2
56041|24000|2000|12
56041|4500|1500|3
56045|500|500|1
56055|1000|1000|1

结果文件如下
56041|28500|3500,3500,3500,2000,2000,2000,2000,2000,2000,2000,2000,2000|12
56038|32500|5000,5000,2500,2500,2500,2500,2500,2500,2500,2500,2500|11
56039|30000|5000,5000,2500,2500,2500,2500,2500,2500,2500,2500|10
56045|500|500|1
56055|1000|1000|1

论坛徽章:
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
5 [报告]
发表于 2018-12-05 13:58 |只看该作者
回复 4# hsinxx


  1. awk -F"|" '{a[$1]+=$2;b[$1]+=$3;if(!c[$1]++){d[$1]=$3;e[$1]=$4};f[$1]=f[$1]>$4?f[$1]-$4:$4-f[$1];g[$1]=g[$1]>$4?g[$1]:$4}END{for(i in a){for(j=1;j<=e[i]-f[i];j++){h[i]=h[i]?h[i]","b[i]:b[i]};for(j=1;j<=f[i];j++){k[i]=k[i]?k[i]","d[i]:d[i]};printf("%s|%s|%s%s|%s\n",i,a[i],h[i]?h[i]",":"",k[i],g[i])}}' file
复制代码

论坛徽章:
0
6 [报告]
发表于 2018-12-05 15:11 |只看该作者
回复 5# wh7211

谢谢大神

论坛徽章:
0
7 [报告]
发表于 2018-12-06 18:01 |只看该作者
回复 5# wh7211

大神
还有点问题,如下数据,
56038|27500|2500|11
56038|5000|2500|2
56039|25000|2500|10
56039|5000|2500|2
56041|24000|2000|12
56041|4500|1500|3
56045|500|500|1
56055|1000|1000|1
56056|5000|1000|5
56057|7000|1000|7

执行你的awk后的结果

56041|28500|3500,3500,3500,2000,2000,2000,2000,2000,2000,2000,2000,2000|12
56038|32500|5000,5000,2500,2500,2500,2500,2500,2500,2500,2500,2500|11
56039|30000|5000,5000,2500,2500,2500,2500,2500,2500,2500,2500|10
56045|500|500|1
56055|1000|1000|1
56056|5000|1000,1000,1000,1000,1000|5
56057|7000|1000,1000,1000,1000,1000,1000,1000,1000|7

我想实现如下结果:
56041|28500|3500,3500,3500,2000,2000,2000,2000,2000,2000,2000,2000,2000|12
56038|32500|5000,5000,2500,2500,2500,2500,2500,2500,2500,2500,2500|11
56039|30000|5000,5000,2500,2500,2500,2500,2500,2500,2500,2500|10
56045|500|500|1
56055|1000|1000|1
56056|5000|1000|5
56057|7000|1000|7

如果$1不同时就直接打印原始数据,如$1相同时$2相加,$3根据$4的分别相加,如1、2行$4分别为11,2,那结果文件以,分隔符的前两列就是1、2行$3相加,后9列直接打印第一行的$3数据。
麻烦大神再帮改一下awk,谢了

论坛徽章:
0
8 [报告]
发表于 2018-12-07 15:59 |只看该作者
回复 5# wh7211



如果是下面数据,执行你的awk后结果有问题呀
56045|5024|2500|2
56045|1718|833|2
56055|10000|1000|10
56055|1579|1000|2
56055|2000|1000|1

执行后的结果:
56055|13579|3000;3000;3000;1000;1000;1000;1000;1000;1000;1000|10
56045|6742|3333;3333;|2

正确结果应该为:
56055|13579|3000;2000;1000;1000;1000;1000;1000;1000;1000;1000|10
56045|6742|3333;3333|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
9 [报告]
发表于 2018-12-10 11:41 |只看该作者
本帖最后由 wh7211 于 2018-12-10 11:52 编辑

回复 8# hsinxx


$1相同的记录最多会有多少行?1楼例子最多是2行,8楼例子最多是3行

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

这个不确定少的1行,多的可能十几行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP