免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: newfinder
打印 上一主题 下一主题

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

论坛徽章:
0
11 [报告]
发表于 2014-09-15 13:54 |只看该作者
回复 2# Kasiotao
不过,大侠,我运行出来的结果的data2_diff有点出入,多了一行,name1 ragne1:4-6 3,按理说它应该在data_comm里(虽然data_comm里也有),不知是哪个地方出了点小问题
data2_diff:
name2 range2:8-9 2
name1 ragne1:4-6 3
name2 range1:26-28 3
name2 range1:17-19 3
   

论坛徽章:
1
处女座
日期:2014-09-18 16:18:00
12 [报告]
发表于 2014-09-15 14:19 |只看该作者
回复 1# newfinder
  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])){if(state[i]>=0)state[i]=0;state[$0]=0;if(m[1]!=n[1])state[i]=state[$0]=-1;}}}}}END{print "data1_diff:";for(i in state){if(state[i]>0&&b[i])print i;}print "data2_diff:";for(i in state){if(state[i]>0&&!b[i])print i;}print "data_comm:";for(i in state)if(state[i]==0){split(i,k,/[:\ ]/);if(out[k[1],k[2]]==0){out[k[1],k[2]]=i}else{split(out[k[1],k[2]],l,/[:\ ]/);out[k[1],k[2]]=l[1]" "l[2]":"l[3]","k[3]" "l[4]","k[4];}};for(i in out){print out[i]};print "------";for(i in state){if(state[i]<0){if(state[i]<0){split(i,k,/[:\ ]/);if(out2[k[2]]==0){out2[k[2]]=i;}else{split(out2[k[2]],l,/[:\ ]/);str=l[2]":"l[3]","k[3]" "l[4]","k[4];if(k[1]!=l[1])out2[k[2]]=l[1]","k[1]" "str;else out2[k[2]]=l[1]" "str;}}}}for(i in out2)print out2[i];}' testfile testfile1
复制代码
  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:4-6,1-3,1-4 3,3,4
  12. name1 range2:12-16,10-15 5,6
  13. name2 range3:3-6,5-9 4,5
  14. name1 range3:11-15,10-12 5,3
  15. ------
  16. name1,name2 range1:21-24,20-25 4,6
  17. name1,name2 range2:4-6,3-4 3,2
复制代码
吃完饭又想了下。。。。把格式输出了。。。。代码很low,你看看能不能用,文本多了会不会出错。。。。

论坛徽章:
1
处女座
日期:2014-09-18 16:18:00
13 [报告]
发表于 2014-09-15 14:23 |只看该作者
回复 11# newfinder
这个我还真不清楚,我是CentOS6.4 awk版本3.1.7,没有你说的多的那一行。。。

   

论坛徽章:
0
14 [报告]
发表于 2014-09-15 14:56 |只看该作者
回复 13# Kasiotao

先赞一个,是这个样子的,数据量大的时候不太清楚,但应该是不会错的。
另外,还是我刚刚提到的那个问题,会多出一行来。
我的系统是红帽的,按理不该有这样的问题,都一样的
   

论坛徽章:
0
15 [报告]
发表于 2014-09-15 15:03 |只看该作者
回复 7# Herowinter
大侠,这个在Linux下可以得出正确的结果,我用Cygwin就少出一个data_comm,是不是这个代码只能用在LINUX下……

   

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
16 [报告]
发表于 2014-09-15 15:23 |只看该作者
回复 12# Kasiotao


    眼都看花了。。。汗=。=

论坛徽章:
0
17 [报告]
发表于 2014-09-15 15:25 |只看该作者
回复 13# Kasiotao
大侠,你看,我用CentOS出来的结果也是多一行,是不是哪里出现什么问题了呢


   

论坛徽章:
1
处女座
日期:2014-09-18 16:18:00
18 [报告]
发表于 2014-09-15 15:35 |只看该作者
回复 17# newfinder
你那一行range 打错了。。。没发现么,突然想起来,我测试的时候刚开始也老是不对,结果你打错了。。。坑

   

论坛徽章:
1
处女座
日期:2014-09-18 16:18:00
19 [报告]
发表于 2014-09-15 15:36 |只看该作者
回复 16# bulletmarquis
。。。我自己都看不下去,偷懒,写着写着越写越长,下次再这样就还是老老实实的换行缩进吧

   

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
20 [报告]
发表于 2014-09-15 15:41 |只看该作者
回复 18# Kasiotao


    笑尿,哈哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP