免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3587 | 回复: 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的效率要高

论坛徽章:
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
16 [报告]
发表于 2014-04-23 10:04 |只看该作者
回复 15# wzl189189


    你用s==b,那s应该没有值,显示不出来,你查查结果是不是少东西。

论坛徽章:
0
15 [报告]
发表于 2014-04-23 00:50 |只看该作者
回复 11# rulebook


){s=b?b:0;print i"\t"a"\t"s}}   你好,请教下, 其中的  s=b  是不是写错了啊,我加了一个等号,即 s==b   发现结果也是对的

   还有就是为什么s第一次循环 打印的时候就有值呢? 不解啊
   

论坛徽章:
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
14 [报告]
发表于 2014-04-16 09:58 |只看该作者
回复 13# wzl189189


    awk 'NR==FNR{a[$1"\t"$2]=$3;next}{b[$1"\t"$2]=b[$1"\t"$2]?b[$1"\t"$2]+$33}END{for(i in a){s=b?b:0;print i"\t"a"\t"s}}' b.txt a.txt

先读b.txt 将第三列数据放到数组a中,数组下标是 [第一列\t第二列] 。
再读a.txt 将第三列数据放到数组b中,数组下标也是 [第一列\t第二列] 。这里将 下标相同的加在一起。
最后按 数组a的下标循环,显示下标相同的数组b的值,当数组b中不存在这个值时显示0.

论坛徽章:
0
13 [报告]
发表于 2014-04-15 23:35 |只看该作者
回复 11# rulebook


    非常感谢啊,这个我运行后是暂时没有问题,你这个写的很精炼了,想提个小要求,能不能解释下这行命令啊,我水平太低,看不懂

论坛徽章:
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
12 [报告]
发表于 2014-04-15 18:14 |只看该作者
回复 10# wzl189189


    上面忘记点回复

论坛徽章:
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
11 [报告]
发表于 2014-04-15 18:13 |只看该作者
  1. awk 'NR==FNR{a[$1"\t"$2]=$3;next}{b[$1"\t"$2]=b[$1"\t"$2]?b[$1"\t"$2]+$3:$3}END{for(i in a){s=b[i]?b[i]:0;print i"\t"a[i]"\t"s}}' b.txt a.txt
复制代码

论坛徽章:
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'  既制表符。
   

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

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

   
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP