免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1731 | 回复: 6

[文本处理] awk 累加并打印每行 [复制链接]

论坛徽章:
0
发表于 2017-03-20 22:11 |显示全部楼层
求用awk 实现,前部分相同,就累加值,并将值放在每行开头,如下:
原文:
a.b.c.1
a.b.c.2
x.y.z.1
x.y.z.2
x.y.z.5
打印输出:
2 a.b.c.1
2 a.b.c.2
3 x.y.z.1
3 x.y.z.2
3 x.y.z.5

论坛徽章:
0
发表于 2017-03-20 22:25 |显示全部楼层
本帖最后由 avyou 于 2017-03-20 22:27 编辑

我自己搞定了
  1. awk  -F '.' 'NR==FNR{a[$1"."$2"."$3]++}NR>FNR{if($1"."$2"."$3 in a)print a[$1"."$2"."$3]," ",$0}' a.txt a.txt
复制代码

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
发表于 2017-03-20 22:31 |显示全部楼层

  1. awk -F. 'NR==FNR{--NF;a[$0]++;next}{s=$0;--NF;print a[$0],s}' file file
复制代码

论坛徽章:
1
15-16赛季CBA联赛之江苏
日期:2016-10-26 16:19:04
发表于 2017-03-21 09:42 |显示全部楼层
awk -F'.' 'NR==FNR{a[$1$2$3]++;next}{print a[$1$2$3],$0}'  file file


论坛徽章:
1
15-16赛季CBA联赛之福建
日期:2016-10-26 14:32:57
发表于 2017-03-21 10:06 |显示全部楼层
awk -vFS="." '{a=$1FS$2FS$3;b[a]+=$4} END{for(i in b)print i,b[i]}' file

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2017-03-21 13:12 |显示全部楼层
本帖最后由 sunzhiguolu 于 2017-03-21 13:14 编辑
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. sub Display{
  5.         my $sum = 0;
  6.         $sum += $_->[-1] for @_;
  7.         print join ('.', $sum, $_->[0]) for @_;
  8. }

  9. my ($lastID, @aData) = ('', ());
  10. while (<DATA>){
  11.         my ($id, $val) = /(\D+)(\d)/;
  12.         if ($lastID ne $id){
  13.                 Display (splice (@aData, 0)) if (@aData);
  14.                 $lastID = $id;
  15.         }
  16.         push (@aData, [$_, $val]);
  17. }
  18. Display  (@aData) if (@aData);

  19. __DATA__
  20. a.b.c.1
  21. a.b.c.2
  22. x.y.z.1
  23. x.y.z.2
  24. x.y.z.5
复制代码

论坛徽章:
0
发表于 2017-03-21 15:48 |显示全部楼层
awk -F. '{if(tag != $1$2$3){for(i=1; i<=n; i++){print n, a[i]} tag=$1$2$3; n=1; a[n]=$0}else{n++; a[n]=$0}}END{for(i=1; i<=n; i++){print n, a[i]}}'
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP