免费注册 查看新帖 |

Chinaunix

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

[文本处理] 数据差异的筛选问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-09-14 23:28 |只看该作者 |倒序浏览
各位大侠,小弟现想处理一个差异筛选的问题,想请大家帮帮忙,看怎么处理

有两个文本data1和data2
data1的内容如下:
name1 range1:1-4 4
name1 range1:7-11 5
name2 range1:13-16 4
name2 range1:20-25 6
name2 range2:3-4 2
name1 range2:10-15 6
name1 range2:18-23 6
name2 range3:5-9 5
name1 range3:11-15 5
name1 range3:18-22 5
…………

data2的内容如下:
name1 range1:1-3 3
name1 ragne1:4-6 3
name2 range1:17-19 3
name1 range1:21-24 4
name2 range1:26-28 3
name1 range2:4-6 3
name2 range2:8-9 2
name1 range2:12-16 5
name2 range3:3-6 4
name1 range3:10-12 3
…………

想根据第二列的数据输出这两个数据集的共同区域及差异区域。
共同区域定义的标准为:只要有一个数字重叠就为一个共同区域,如1-2、2-3就为一个共同区域
差异区域定义的标准为:没有一个数字重叠

按照这个标准来做的话,上面的这两个数据集的结果应该为:
data1_diff:
name1 range1:7-11 5
name2 range1:13-16 4
name1 range2:18-23 6
naem1 range3:18-22 5

data2_diff:
name2 range1:17-19 3
name2 range1:26-28 3
name2 range2:8-9 2

两个数据集共同的区域为:
data_comm:
name1 range1:1-4,1-3,4-6 4,3,3
name2,name1 range1:20-25,21-24 6,4
name2,name1 range2:3-4,4-6 2,3
name1 range2:10-15,12-16 6,5
name2 range3:5-9,3-6 5,4
name1 range3:11-15,10-12 5,3

跪请帮忙

论坛徽章:
1
处女座
日期:2014-09-18 16:18:00
2 [报告]
发表于 2014-09-15 09:17 |只看该作者
回复 1# newfinder
写的自己都看不下去了,效率不高,至少O(n^2),data_comm输出好复杂。。。懒得想了,坐等大神
  1. awk -vc=0 '{if(NR==FNR)b[$0]=1;elseb[$0]=0;c++;state[$0]+=c;if(NR>1){split($0,n,/[:\-\ ]/);for(i in state){split(i,m,/[:\-\ ]/);if(m[2]==n[2]&&state[i]<state[$0]){if(!(m[3]>n[4]||m[4]<n[3])){state[i]=0;state[$0]=0}}}}}END{print "data1_diff:";for(i in state){if(state[i]&&b[i])print i;}print "data2_diff:";for(i in state){if(state[i]&&!b[i])print i;}print "data_comm:";for(i in state)if(!state[i])print i;}' data1 data2
复制代码
结果:
  1. data1_diff:
  2. name1 range1:7-11 5
  3. name1 range3:18-22 5
  4. name2 range1:13-16 4
  5. name1 range2:18-23 6
  6. data2_diff:
  7. name2 range1:26-28 3
  8. name2 range2:8-9 2
  9. name2 range1:17-19 3
  10. data_comm:
  11. name1 range1:21-24 4
  12. name1 range1:4-6 3
  13. name1 range3:11-15 5
  14. name2 range1:20-25 6
  15. name1 range2:4-6 3
  16. name1 range1:1-3 3
  17. name2 range2:3-4 2
  18. name2 range3:3-6 4
  19. name1 range2:12-16 5
  20. name1 range2:10-15 6
  21. name1 range1:1-4 4
  22. name2 range3:5-9 5
  23. name1 range3:10-12 3
复制代码

论坛徽章:
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-09-15 09:19 |只看该作者
你不是在perl版发过了吗?

论坛徽章:
768
金牛座
日期: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-09-15 10:21 |只看该作者
回复 3# yestreenstars

我去看了下perl版的原贴,好像需求描述和这不大一样,
有点晕了,不会写...
   

论坛徽章:
768
金牛座
日期: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
5 [报告]
发表于 2014-09-15 11:20 |只看该作者
回复 1# newfinder

需求终于看懂了,这个打印格式实在是....
name2,name1 range1:20-25,21-24 6,4
name2,name1 range2:3-4,4-6 2,3

论坛徽章:
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
6 [报告]
发表于 2014-09-15 12:09 |只看该作者
回复 5# Herowinter

加油,你能行的,我最近不爱动脑了~
   

论坛徽章:
768
金牛座
日期: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
7 [报告]
发表于 2014-09-15 12:15 |只看该作者
本帖最后由 Herowinter 于 2014-09-15 13:17 编辑

@newfinder@Kasiotao
2楼这种打印格式好像可以这样.
  1. awk -F'[ :-]' '{for(i=$3;i<=$4;i++)count[$2" "i]++;a[$0]=FILENAME} END{for(i in a){split(i,b,"[ :-]");k=0;for(j=b[3];j<=b[4];j++)if(count[b[2]" "j]>1){k=1;break};if(k)print i|"sort -k1,2>data_comm";else print i|"sort -k1,2>"a[i]"_diff"}}' data1 data2

  2. cat data1_diff
  3. name1 range1:7-11 5
  4. name1 range2:18-23 6
  5. name1 range3:18-22 5
  6. name2 range1:13-16 4
  7. cat data2_diff
  8. name2 range1:17-19 3
  9. name2 range1:26-28 3
  10. name2 range2:8-9 2
  11. cat data_comm
  12. name1 range1:1-3 3
  13. name1 range1:1-4 4
  14. name1 range1:21-24 4
  15. name1 range1:4-6 3
  16. name1 range2:10-15 6
  17. name1 range2:12-16 5
  18. name1 range2:4-6 3
  19. name1 range3:10-12 3
  20. name1 range3:11-15 5
  21. name2 range1:20-25 6
  22. name2 range2:3-4 2
  23. name2 range3:3-6 4
  24. name2 range3:5-9 5
复制代码

论坛徽章:
0
8 [报告]
发表于 2014-09-15 13:03 |只看该作者
回复 3# yestreenstars
恩,是的,大侠,因为最近两个都在接触一点,所以想看看在shell下这个怎么用。结果被发现了……呵呵{:2_166:}

   

论坛徽章:
0
9 [报告]
发表于 2014-09-15 13:06 |只看该作者
回复 2# Kasiotao
恩恩,多谢了,辛苦了,我也知道自己要求有点过分……sorry啦,不过大侠还是给出了……

   

论坛徽章:
0
10 [报告]
发表于 2014-09-15 13:19 |只看该作者
回复 7# Herowinter
多谢大侠了,我的格式要求估计真的不好,我可以后期再改,多谢了!!!

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP