免费注册 查看新帖 |

Chinaunix

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

[文本处理] 急,有详细的说明,2个文本求和及合并的shell问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-04-15 01:41 |只看该作者 |倒序浏览
假如有个学生表  第一列是学号  第二列是选课的名称  第三列是考试的分数
a.txt

11111        tom        30
11111        tom        80
22222        jerry        33
22222        jerry        57
33333     jerry        22

下面这个是  第一列是学号  第二列是选课的名称  第三列是考试的总分
b.txt
11111        tom        100       
22222        jerry        100
33333         jerry        100
44444        merry        100


    由于数据量比较大所以希望的结果如下
结果一: 根据上面的a.txt 和b.txt 列出每个学生的最后加和,如果不在a.txt中就是0
11111        tom        100        110
22222        jerry        100        90
33333        jerry        100        22
44444        merry        100        0
结果二: 在结果1的基础上找出考试加和大于总分的行。
11111        tom        100        110
结果三: 在结果1中找出 加和与总分小于等于10的行
22222        jerry        100        90

这个shell可以合并写,也可以分开单独分别写 ,因为数据量大,所以shell的效率要高

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
2 [报告]
发表于 2014-04-15 08:03 |只看该作者
楼主的需求其实很简单, 把学生的成绩插入数据库, 然后, 你想要什么结果, 基本上是分分钟的事.

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
3 [报告]
发表于 2014-04-15 09:21 |只看该作者
  1. $ awk -vOFS='\t' '{t=$1"\t"$2}NR==FNR{a[t]+=$3;next}{b[t]+=$3}END{for(i in b)printf "%s\t%d\t%d\n",i,b[i],a[i];print "";for(i in a)if(a[i]>b[i])print i,b[i],a[i];print "";for(i in b)if((b[i]-a[i]>=0)&&(b[i]-a[i]<=10))printf "%s\t%d\t%d\n",i,b[i],a[i]}' a.txt b.txt
  2. 33333   jerry   100     22
  3. 44444   merry   100     0
  4. 22222   jerry   100     90
  5. 11111   tom     100     110

  6. 11111   tom     100     110

  7. 22222   jerry   100     90
复制代码

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
4 [报告]
发表于 2014-04-15 09:45 |只看该作者
回复 2# q1208c
其实我也觉得是数据库该管的事,
除非楼主有什么特别的原因。

   

论坛徽章:
6
处女座
日期:2014-04-02 16:07:17酉鸡
日期:2014-04-14 10:09:22子鼠
日期:2014-04-17 11:57:30辰龙
日期:2014-09-01 17:14:08戌狗
日期:2014-10-28 12:25:54未羊
日期:2014-11-14 11:31:58
5 [报告]
发表于 2014-04-15 10:33 |只看该作者
结果1
  1. awk 'NR==FNR{a[$1" "$2]=$3;next}{b[$1" "$2]=b[$1" "$2]?b[$1" "$2]+$3:$3}END{for(i in a){s=b[i]?b[i]:0;print i" 100 "s}}' b.txt a.txt
复制代码
结果2
  1. awk 'NR==FNR{a[$1" "$2]=$3;next}{b[$1" "$2]=b[$1" "$2]?b[$1" "$2]+$3:$3}END{for(i in a){s=b[i]?b[i]:0;print i" 100 "s}}' b.txt a.txt | awk '$4>100'
复制代码
结果3
  1. awk 'NR==FNR{a[$1" "$2]=$3;next}{b[$1" "$2]=b[$1" "$2]?b[$1" "$2]+$3:$3}END{for(i in a){s=b[i]?b[i]:0;print i" 100 "s}}' b.txt a.txt | awk '$4<=100&&$4>=90'
复制代码

论坛徽章:
0
6 [报告]
发表于 2014-04-15 11:35 |只看该作者
谢谢大家的提醒,但是我这里因为成本等原因,只能用shell分析

论坛徽章:
0
7 [报告]
发表于 2014-04-15 11:36 |只看该作者
数据量比较大,每天可能有几千万或上亿条数据进行分析,所以定下来用shell了

论坛徽章:
0
8 [报告]
发表于 2014-04-15 11:47 |只看该作者
回复 3# yestreenstars

谢谢啊,这个太精炼了,还没有看懂,我这个例子是用 '\t‘ 做分隔符的,你这个能不能对不通过的结果 拆成不同的shell 啊?

   

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
9 [报告]
发表于 2014-04-15 15:25 |只看该作者
回复 7# wzl189189

这个级别的数据量, 必须是数据库.

shell 处理, 如果中间出错, 你查都没的查. 只能重头来过.

我不是太明白, 数据库要什么成本?
mysql 收你钱了?
   

论坛徽章:
0
10 [报告]
发表于 2014-04-15 18:05 |只看该作者
回复 5# rulebook

谢谢啊,不过有点问题,就是
01.awk 'NR==FNR{a[$1" "$2]=$3;next}{b[$1" "$2]=b[$1" "$2]?b[$1" "$2]+$33}END{for(i in a){s=b?b:0;print i" 100 "s}}' b.txt a.txt


    1、   print i" 100 "s   这个你是固定,不是取b.txt中的第三列的值,第三例的值会变化的  
   2、  结果的字段能否用'\t'  既制表符。
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP