免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
123下一页
最近访问板块 发新帖
查看: 1339 | 回复: 25

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

论坛徽章:
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数据。


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

论坛徽章:
21
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之深圳
日期:2018-06-15 14:59:3715-16赛季CBA联赛之八一
日期:2018-07-03 16:56:4615-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-06-08 13:45:2815-16赛季CBA联赛之同曦
日期:2018-06-04 19:42:2015-16赛季CBA联赛之山东
日期:2018-05-30 12:44:59
发表于 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
发表于 2018-12-05 10:11 |显示全部楼层
谢谢大神,真给力,解决我的难题

论坛徽章:
0
发表于 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

论坛徽章:
21
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之深圳
日期:2018-06-15 14:59:3715-16赛季CBA联赛之八一
日期:2018-07-03 16:56:4615-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-06-08 13:45:2815-16赛季CBA联赛之同曦
日期:2018-06-04 19:42:2015-16赛季CBA联赛之山东
日期:2018-05-30 12:44:59
发表于 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
发表于 2018-12-05 15:11 |显示全部楼层
回复 5# wh7211

谢谢大神

论坛徽章:
0
发表于 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
发表于 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

大神求解呀

论坛徽章:
21
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之深圳
日期:2018-06-15 14:59:3715-16赛季CBA联赛之八一
日期:2018-07-03 16:56:4615-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-06-08 13:45:2815-16赛季CBA联赛之同曦
日期:2018-06-04 19:42:2015-16赛季CBA联赛之山东
日期:2018-05-30 12:44:59
发表于 2018-12-10 11:41 |显示全部楼层
本帖最后由 wh7211 于 2018-12-10 11:52 编辑

回复 8# hsinxx


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

论坛徽章:
0
发表于 2018-12-10 11:47 |显示全部楼层
回复 9# wh7211

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

本版积分规则 发表回复

数据风云,十年变迁
DTCC 第十届中国数据库技术大会已启航!

2019年5月8日~5月10日,由IT168旗下ITPUB企业社区平台主办的第十届中国数据库技术大会(DTCC2019),将在北京隆重召开。大会将邀请百余位行业专家,就热点技术话题进行分享,是广大数据领域从业人士的又一次年度盛会和交流平台。与SACC2018类似,本届大会将采用“3+2”模式:3天传统技术演讲+2天深度主题培训。大会不仅提供超100场的主题演讲,还会提供连续2天的深度课程培训,深化数据领域的项目落地实践方案。
DTCC2019,一场值得期待的数据技术盛会,殷切地希望您报名参与!

活动入口>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP