免费注册 查看新帖 |

Chinaunix

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

[文本处理] 工作需要,急用,新手求大侠帮忙,在线等--快点帮帮我 [复制链接]

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

文本A内容:
............................
2029 11501 20120627005500 48826174 233457 1312600 47737422 3916 528200 28 0 0 769340 2603 24669 15 0 0 2846 37 6485 78
2029 11501 20120627010000 65577884 153471 1601400 64082610 4472 582653 27 0 0 1043082 3494 23010 14 0 0 2867 38 7954 53
2029 11501 20120627010500 20571053 150965 689200 20076088 1912 187456 10 0 0 451898 1520 6576 4 0 0 1740 29 3387 59
2029 11501 20120627011000 70511642 420639 1596200 69630339 5009 398171 21 0 0 885703 2940 18068 11 0 0 2421 105 7832 149
2029 11501 20120627011500 11636761 207051 445000 11487589 1345 97394 6 0 0 255499 868 3330 2 0 0 1195 39 2158 67
2029 11501 20120627010500 10571053 150965 689200 20076088 1912 187456 10 0 0 451898 1520 0 4 0 0 1740 29 3387 0
.............................

问题:
以文本A的前三列为KEY,如果一样,那么后面的其他列都分别纵向累加;
在线等,谢谢了;

论坛徽章:
0
2 [报告]
发表于 2012-09-12 12:36 |只看该作者
本帖最后由 llh580110 于 2012-09-12 12:40 编辑
  1. awk '{for(i=4;i<=NF;i++){a[$1" "$2" "$3" "i]+=$i}}END{for(i in a) print i,a[i]}' A|sort -n -k3,3 -k4 |awk '{a[$1" "$2" "$3]=a[$1" "$2" "$3]" "$5}END{for(i in a)print i,a[i]}'
复制代码
试试....

论坛徽章:
0
3 [报告]
发表于 2012-09-12 13:01 |只看该作者
本帖最后由 dsy851009 于 2012-11-07 11:04 编辑
llh580110 发表于 2012-09-12 12:36
试试....

非常感谢您!我导师弄了半天说列数太多了,不好弄,呵呵我就来网上求助了,你的这条可以实现我试了,呵呵....

抱歉这里好像多出了一列,执行结果变为下面的了:
2029 11501 20120627005500  20120627005500 48826174 233457 1312600 47737422 3916 528200 28 0 0 769340 2603 24669 15 0 0 2846 37 6485 78
2029 11501 20120627010000  20120627010000 65577884 153471 1601400 64082610 4472 582653 27 0 0 1043082 3494 23010 14 0 0 2867 38 7954 53
2029 11501 20120627011000  20120627011000 70511642 420639 1596200 69630339 5009 398171 21 0 0 885703 2940 18068 11 0 0 2421 105 7832 149
2029 11501 20120627010500  40241254021000 31142106 301930 1378400 40152176 3824 374912 20 0 0 903796 3040 6576 8 0 0 3480 58 6774 59
2029 11501 20120627011500  20120627011500 11636761 207051 445000 11487589 1345 97394 6 0 0 255499 868 3330 2 0 0 1195 39 2158 67

论坛徽章:
0
4 [报告]
发表于 2012-09-12 13:01 |只看该作者
不一样的,需要全部输出吗?

论坛徽章:
0
5 [报告]
发表于 2012-09-12 13:06 |只看该作者
kk5234 发表于 2012-09-12 13:01
不一样的,需要全部输出吗?

不一样的需要全部输出,只是如果前三列重复就显示为一条,并纵向累加;

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
6 [报告]
发表于 2012-09-12 13:35 |只看该作者
dsy851009 发表于 2012-09-12 15:01
非常感谢您!我导师弄了半天说列数太多了,不好弄,呵呵我就来网上求助了,你的这条可以实现我试了,呵呵 ...

难为你导师了。
  1. awk '{s=$1 FS $2 FS $3;b[s];for (i=4;i<=NF;i++) a[s FS i]+=$i;max=NF>max?NF:max}
  2.      END{for (j in b) {printf j;for (i=4;i<=max;i++) printf FS a[j FS i]; printf RS}}' infile

  3. 2029 11501 20120627010500 31142106 301930 1378400 40152176 3824 374912 20 0 0 903796 3040 6576 8 0 0 3480 58 6774 59
  4. 2029 11501 20120627010000 65577884 153471 1601400 64082610 4472 582653 27 0 0 1043082 3494 23010 14 0 0 2867 38 7954 53
  5. 2029 11501 20120627011500 11636761 207051 445000 11487589 1345 97394 6 0 0 255499 868 3330 2 0 0 1195 39 2158 67
  6. 2029 11501 20120627011000 70511642 420639 1596200 69630339 5009 398171 21 0 0 885703 2940 18068 11 0 0 2421 105 7832 149
  7. 2029 11501 20120627005500 48826174 233457 1312600 47737422 3916 528200 28 0 0 769340 2603 24669 15 0 0 2846 37 6485 78
复制代码

论坛徽章:
0
7 [报告]
发表于 2012-09-12 13:49 |只看该作者
rdcwayx 发表于 2012-09-12 13:35
难为你导师了。

谢谢大师,虽然我看不懂,但是帮了我大忙了

论坛徽章:
0
8 [报告]
发表于 2012-09-12 18:23 |只看该作者
本帖最后由 ljwd1000 于 2012-09-12 18:24 编辑

回复 6# rdcwayx


    版主的代码考虑的果然很全面,不知道max=NF>max?NF:max这里的三目运算怎么理解呢??
   主要是前面的表达式部分不是很清楚max=NF>max,谢谢了

    已经自己搞清楚了。就是给max赋值,多谢了

论坛徽章:
0
9 [报告]
发表于 2012-09-12 20:45 |只看该作者
  1. awk 'BEGIN{FS=" ";ORS=""}{s=$1 FS $2 FS $3; title[s];for(i = 4; i<=NF; i++){array[s FS i]+=$i}max=NF>max?NF:max}END{for(j in title){print j;for(i=4;i<=max;i++){print FS array[j FS i]}print RS}}' infile
复制代码
版主是在强大,像版主学习。 如果在匹配之前先指定一下FS,ORS 就更完美了。

论坛徽章:
15
2015年辞旧岁徽章
日期:2015-03-03 16:54:15双鱼座
日期:2015-01-15 17:29:44午马
日期:2015-01-06 17:06:51子鼠
日期:2014-11-24 10:11:13寅虎
日期:2014-08-18 07:10:55酉鸡
日期:2014-04-02 12:24:51双子座
日期:2014-04-02 12:19:44天秤座
日期:2014-03-17 11:43:36亥猪
日期:2014-03-13 08:13:51未羊
日期:2014-03-11 12:42:03白羊座
日期:2013-11-20 10:15:18CU大牛徽章
日期:2013-04-17 11:48:45
10 [报告]
发表于 2012-09-13 04:33 |只看该作者
@Ace_kream
你最好再查查是否还需要对FS, OFS赋值。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP