免费注册 查看新帖 |

Chinaunix

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

数据连接 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-05-30 23:38 |只看该作者 |倒序浏览
原文件格式类似如下:
节点号|beginnumber|endnumber|counts|
106|3363120000|3363129999|10000|
106|3363130000|3363139999|10000|
106|3363140000|3363149999|10000|
106|3363150000|3363159999|10000|
106|3363160000|3363199999|40000|
106|3363200000|3363209999|10000|
106|3363210000|3363239999|30000|
106|3363240000|3363249999|10000|
106|3363250000|3363259999|10000|
106|3363260000|3363269999|10000|
106|3363270000|3363299999|30000|
106|3368440000|3368499999|60000|
106|3368560000|3368579999|20000|
310|3337000000|3337000100|101|
310|3337000102|3337004103|4002|
310|3337004104|3337004104|1|
310|3337004105|3337006110|2006|
310|3337006111|3337006111|1|
310|3337006112|3337009999|3888|
310|3337010000|3337039999|30000|
310|3337050000|3337289999|240000|
310|3337300000|3337319999|20000|
310|3337330000|3337369999|40000|
310|3337390000|3337399999|10000|
310|3337410000|3337599999|190000|
310|3337710000|3337729999|20000|
310|3337740000|3337999999|260000|
310|3338320000|3338329999|10000|
310|3342500000|3342599999|100000|
310|3342610000|3342849999|240000|
310|3342870000|3342919999|50000|
310|3342950000|3342959999|10000|
310|3362120960|3362120961|2|
311|3313460000|3313460099|100|
311|3313460102|3313469999|9898|
311|3313470000|3313499999|30000|
311|3313500000|3313500101|102|
311|3313500102|3313500102|1|
311|3313500103|3313599999|99897|
311|3313600000|3313658116|58117|
311|3313658117|3313658117|1|
311|3313658118|3313699999|41882|
311|3313700000|3313799999|100000|
311|3319760000|3319769999|10000|
311|3322101921|3322101921|1|
311|3343003347|3343003347|1|
311|3362120962|3362120963|2|

现在需要写个脚本进行合并,将节点号相同的连续号段合起来,并且记录数也要加起来。
如:
106|3363120000|3363129999|10000|
106|3363130000|3363139999|10000|

=>
106|3363120000|3363139999|20000|

注意节点号不同的不能合并,如
310|3362120960|3313459999|2|
311|3313460000|3313460099|100|

不能合并

论坛徽章:
1
摩羯座
日期:2014-12-29 15:59:36
2 [报告]
发表于 2011-05-31 00:23 |只看该作者
  1. awk -F"|" 'NR==1{print;next}{a[$1]?a[$1]>$2?a[$1]=$2:0:a[$1]=$2;b[$1]?b[$1]<$3?b[$1]=$3:0:b[$1]=$3;c[$1]+=$4}END{for(i in a){print i FS a[i] FS b[i] FS c[i] FS}}' file
复制代码

论坛徽章:
0
3 [报告]
发表于 2011-05-31 01:43 |只看该作者
是要求这样吗,写的有点丑陋了

  1. # cat file
  2. 106|3363120000|3363129999|10000|
  3. 106|3363130000|3363139999|10000|
  4. 310|3362120960|3313459999|2|
  5. 311|3313460000|3313460099|100|
  6. 106|3363110000|3336311001|1|

  7. #  awk -F "|" '{if(!a[$1]){a[$1]=$1;b[$1]=$2;c[$1]=$3;d[$1]=$4}else{b[$1]=$2<b[$1]?$2:b[$1];c[$1]=$3<c[$1]?c[$1]:$3;d[$1]+=$4}}END{for(i in a)printf "%s|%s|%s|%s|\n",a[i],b[i],c[i],d[i]}' file
  8. 310|3362120960|3313459999|2|
  9. 311|3313460000|3313460099|100|
  10. 106|3363110000|3363139999|20001|
复制代码

论坛徽章:
0
4 [报告]
发表于 2011-05-31 08:29 |只看该作者
311|3313460000|3313460099|100|
311|3313460102|3313469999|9898|
311|3313470000|3313499999|30000|

这个如何合并?
311|3313460000|3313460099|100|
311|3313460102|3313499999|39898|
还是
311|3313460000|3313499999|39998|

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
5 [报告]
发表于 2011-05-31 22:46 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2011-06-01 02:30 |只看该作者
311|3313460000|3313460099|100|
311|3313460102|3313469999|9898|
311|3313470000|3313499999|30000|

...
ywlscpl 发表于 2011-05-31 08:29



   这个不能连接在一起,合并的要求是: 数字上连续,上一行的结束+1=下一行的开始,

看来用awk之类的实现起来,还是不太容易,同事用perl写了个,可用. 对perl不懂,没来得及研究.

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
7 [报告]
发表于 2011-06-01 03:35 |只看该作者
本帖最后由 yinyuemi 于 2011-06-01 04:40 编辑

回复 6# gdutllf2006


是这个么?
P.S. 你之前问题的描述不够明确,大家不好给出答案, awk的功能很强大,"只有想不到,没有做不到"
  1. awk -F'|' '
  2.         {node_[$1]}
  3.         {
  4.                 if($2==end+1){
  5.                         end=$3;sum+=$4}
  6.                 else
  7.                         {begin_[node"|"++p]=begin;end_[node"|"p]=end;sum_[node"|"p]=sum;begin=$2;end=$3;sum=$4;node=$1}
  8.                         }
  9.         END{for(i=2;i<p;i++) for(j in node_) if( j"|"i in sum_) print j FS begin_[j"|"i] FS end_[j"|"i] FS sum_[j"|"i]}
  10. ' rawdata <(echo "")

  11. 106|3363120000|3363299999|180000
  12. 106|3368440000|3368499999|60000
  13. 106|3368560000|3368579999|20000
  14. 310|3337000000|3337000100|101
  15. 310|3337000102|3337039999|39898
  16. 310|3337050000|3337289999|240000
  17. 310|3337300000|3337319999|20000
  18. 310|3337330000|3337369999|40000
  19. 310|3337390000|3337399999|10000
  20. 310|3337410000|3337599999|190000
  21. 310|3337710000|3337729999|20000
  22. 310|3337740000|3337999999|260000
  23. 310|3338320000|3338329999|10000
  24. 310|3342500000|3342599999|100000
  25. 310|3342610000|3342849999|240000
  26. 310|3342870000|3342919999|50000
  27. 310|3342950000|3342959999|10000
  28. 310|3362120960|3362120961|2
  29. 311|3313460000|3313460099|100
  30. 311|3313460102|3313799999|339898
  31. 311|3319760000|3319769999|10000
  32. 311|3322101921|3322101921|1
  33. 311|3343003347|3343003347|1
  34. 311|3362120962|3362120963|2
复制代码

论坛徽章:
0
8 [报告]
发表于 2011-06-01 08:34 |只看该作者
awk是流程完备的脚本语言(循环、判断、自定义函数),gnu awk更是有很多强大的内置函数
本身设计为数据处理的专用利器,楼主这道题对awk来说并不算难

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
9 [报告]
发表于 2011-06-01 10:23 |只看该作者
回复  gdutllf2006


是这个么?
P.S. 你之前问题的描述不够明确,大家不好给出答案, awk的功能很强大 ...
yinyuemi 发表于 2011-06-01 03:35


可化简如下....
$ awk -F'|' '
  BEGIN{OFS="|"}
  NR==1{A=$0;N=$1;next}
  {   
      if(($1!=N)||($2!=end+1)){print A;A=$0;N=$1;beg=$2;end=$3;cnt=$4;next}
      end=$3;cnt+=$4;$4=cnt;A=$0
  }
  END{print A}
  ' combine.txt




$ awk -F'|' 'BEGIN{OFS="|"}NR==1{A=$0;N=$1;next}{if(($1!=N)||($2!=end+1)){print A;A=$0;N=$1;beg=$2;end=$3;cnt=$4;next}end=$3;cnt+=$4;$4=cnt;A=$0}END{print A}' combine.txt
节点号|beginnumber|endnumber|counts|
106|3363270000|3363299999|180000|
106|3368440000|3368499999|60000|
106|3368560000|3368579999|20000|
310|3337000000|3337000100|101|
310|3337010000|3337039999|39898|
310|3337050000|3337289999|240000|
310|3337300000|3337319999|20000|
310|3337330000|3337369999|40000|
310|3337390000|3337399999|10000|
310|3337410000|3337599999|190000|
310|3337710000|3337729999|20000|
310|3337740000|3337999999|260000|
310|3338320000|3338329999|10000|
310|3342500000|3342599999|100000|
310|3342610000|3342849999|240000|
310|3342870000|3342919999|50000|
310|3342950000|3342959999|10000|
310|3362120960|3362120961|2|
311|3313460000|3313460099|100|
311|3313700000|3313799999|339898|
311|3319760000|3319769999|10000|
311|3322101921|3322101921|1|
311|3343003347|3343003347|1|
311|3362120962|3362120963|2|

论坛徽章:
0
10 [报告]
发表于 2011-06-04 17:48 |只看该作者
嗯,多谢各位老大,
每天的工作就是跟这些数据文件,数据库打交道,
对awk的使用还不够。

对需要处理几行之间的关系的时候,还不知道如何使用awk.

学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP