免费注册 查看新帖 |

Chinaunix

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

[文本处理] 求教 范围匹配 [复制链接]

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-10-29 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-11-26 12:39 |只看该作者 |倒序浏览
本帖最后由 catloverat99 于 2015-11-26 13:23 编辑

file1最后一列 rel_pos的值是否落在另一个文件file2中的区间(例如第一行 267为起点 346为钟点)。
ENSRNOG000000xx1是不同的ID,是两个文件都含有的. 注:一定要ID先匹配再考虑范围
最后输出 2种
1. 以file2为主,如果file1的rel_pos的值落在另一个文件file2中的区间,在file2添加一列,填yes,否则no
2.以file1 为主,如果file1的rel_pos的值落在另一个文件file2中的区间,在file1添加一列,填yes,否则no。

感谢之前大神的代码,$ awk 'FNR==NR{a[$NF]=$0;next}{YN="No";for(n in a)if($2<=+n&&+n<=$3){YN="Yes";break}print $0,YN}' file1 file2
结果似乎不太对,请问是不是这里忽略了id的匹配? 如何把id给匹配上

file1
value.V1        value.V2        value.V3        value.V4        value.V5        value.V6        value.V7        value.V8        value.V9        chromosome        start        end        dmr_length        rel_pos
chr1        17618115        T        C        CC        CC        TT        TT        ENSRNOG00000013436_451        chr1        17617848        17618216        369        268
chr1        17618162        A        C        CC        CC        AA        AA        ENSRNOG00000013436_451        chr1        17617848        17618216        369        315
chr1        24197584        A        G        GG        GG        AG        AG        ENSRNOG00000016371_102        chr1        24197021        24198790        1770        564
chr1        24197597        C        T        TT        TT        CT        CT        ENSRNOG00000016371_102        chr1        24197021        24198790        1770        577
chr1        24197733        G        C        CC        CC        GC        GG        ENSRNOG00000016371_102        chr1        24197021        24198790        1770        713
chr1        24197750        G        A        AA        AA        GG        GG        ENSRNOG00000016371_102        chr1        24197021        24198790        1770        730

file2
V$GLI_Q3 267 346 g2_ENSRNOG00000013436_451
V$GKLF_Q4 345 351 g2_ENSRNOG00000013436_451
V$IK_Q5_01 345 351 g2_ENSRNOG00000013436_451
V$TTF1_Q5_01 347 353 g2_ENSRNOG00000013436_451
V$COE1_Q6 347 360 g2_ENSRNOG00000013436_451
V$TBX5_01 13 24 g2_ENSRNOG00000016371_102
V$RBPJK_01 27 37 g2_ENSRNOG00000016371_102
V$DR4_Q2 34 50 g2_ENSRNOG00000016371_102
V$BBX_04 117 133 g2_ENSRNOG00000016371_102
V$BBX_04 118 134 g2_ENSRNOG00000016371_102

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-10-29 06:20:00
2 [报告]
发表于 2015-11-26 13:28 |只看该作者
没有大神来帮忙看看么。。。

论坛徽章:
16
CU十二周年纪念徽章
日期:2013-10-24 15:41:3415-16赛季CBA联赛之广东
日期:2015-12-23 21:21:55青铜圣斗士
日期:2015-12-05 10:35:30黄金圣斗士
日期:2015-11-26 20:42:16神斗士
日期:2015-11-19 12:47:50每日论坛发贴之星
日期:2015-11-18 06:20:00程序设计版块每日发帖之星
日期:2015-11-18 06:20:002015亚冠之城南
日期:2015-11-10 19:10:492015亚冠之萨济拖拉机
日期:2015-10-28 18:47:282015亚冠之柏太阳神
日期:2015-08-30 17:21:492015亚冠之山东鲁能
日期:2015-07-07 18:48:39摩羯座
日期:2014-08-29 23:01:42
3 [报告]
发表于 2015-11-26 14:57 |只看该作者
  1. cat awk.awk
  2. #!/usr/bin/awk -f

  3. # Recoder per line base on file2's id
  4. NR==FNR {
  5.     file1num ++
  6.     file1[FNR]=$0
  7.     if ($1 ~ "value")
  8.         next

  9.     if (id1lines[$9]) {
  10.         id1lines[$9]=id1lines[id]""FNR"-"
  11.     } else {
  12.         id1lines[$9]=FNR"-"
  13.     }
  14.     next   
  15. }
  16. {
  17.     file2[FNR]=$0
  18.     file2num ++
  19.     split($4,a,"_")
  20.     id=a[2]"_"a[3]
  21.     if (id2lines[id]) {
  22.         id2lines[id]=id2lines[id]""FNR"-"
  23.     } else {
  24.         id2lines[id]=FNR"-"
  25.     }
  26. }
  27. END {
  28.     addyesnotofile1(file1,file2)
  29.     addyesnotofile2(file1,file2)   
  30. }
  31. function addyesnotofile1(file1,file2) {
  32.     len = file1num
  33.     for (i=1; i <= len; i++) {
  34.         if (file1[i] ~ "value") {
  35.             print file1[i] >> "file1.tmp"
  36.             continue
  37.         }
  38.         # found all lines in file2 base on keyid
  39.         split(file1[i],a)
  40.         keyid = a[9]
  41.         repos = a[14]

  42.         # check if keyid exist in file2
  43.         if (! id2lines[keyid]) {
  44.             print file1[i]," NO" >> "file1.tmp"
  45.             continue
  46.         }
  47.         found=0
  48.         # check if range fit
  49.         split(id2lines[keyid],a,"-")
  50.         for (j in a) {
  51.             split(file2[j],b)
  52.             min = b[2]
  53.             max = b[3]
  54.             if ((min <= repos) && (repos <= max)) {
  55.                 print file1[i]," YES" >> "file1.tmp"
  56.                 found = 1
  57.                 break
  58.             }
  59.         }

  60.         if (found) {
  61.             continue   
  62.         }
  63.         # not fit ranges
  64.         print file1[i]," NO" >> "file1.tmp"
  65.     }
  66.         
  67. }

  68. function addyesnotofile2(file1,file2) {
  69.     len = file2num
  70.     for (i=1;i<=len;i++) {
  71.         # give file2 keyid
  72.         split(file2[i""],a)
  73.         min = a[2]
  74.         max = a[3]
  75.         split(a[4],b,"_")
  76.         keyid = b[2]"_"b[3]
  77.         if (! id1lines[keyid]) {
  78.             print file2[i]," NO" >> "file2.tmp"
  79.             continue
  80.         }
  81.         found = 0
  82.         # Travel all lines base on keyid
  83.         split(id1lines[keyid],b,"-")
  84.         for (j in b) {
  85.             # give repos value
  86.             split(file1[j],a)
  87.             repos = a[14]
  88.             if ((min <= repos) && (repos <= max)) {
  89.                 found = 1
  90.                 print file2[i]," YES" >> "file2.tmp"
  91.                 break
  92.             }
  93.         }
  94.         if (found) {
  95.             continue
  96.         }
  97.         # not fit ranges
  98.         print file2[i]," NO" >> "file2.tmp"
  99.     }   
  100. }
复制代码

评分

参与人数 1信誉积分 +5 收起 理由
catloverat99 + 5 很给力!

查看全部评分

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-10-29 06:20:00
4 [报告]
发表于 2015-11-26 16:01 |只看该作者
本帖最后由 catloverat99 于 2015-11-26 16:12 编辑

谢谢!太感谢了,我先试试:)

论坛徽章:
54
2015亚冠之德黑兰石油
日期:2015-07-07 13:00:1615-16赛季CBA联赛之深圳
日期:2016-03-31 09:03:5415-16赛季CBA联赛之辽宁
日期:2016-05-09 20:38:15程序设计版块每日发帖之星
日期:2016-05-12 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-13 15:19:4715-16赛季CBA联赛之福建
日期:2016-05-15 20:24:34每日论坛发贴之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之吉林
日期:2016-05-26 11:49:4715-16赛季CBA联赛之广东
日期:2016-05-26 13:49:18极客徽章
日期:2016-12-07 14:05:2315-16赛季CBA联赛之广夏
日期:2016-12-20 17:33:532017金鸡报晓
日期:2017-01-10 15:19:56
5 [报告]
发表于 2015-11-26 16:36 |只看该作者
本帖最后由 haooooaaa 于 2015-11-26 17:15 编辑

按行比较?
  1. awk 'function get(h,n,w){
  2.     split(h, u, n)
  3.     return u[w]
  4. }
  5. function pp(q,r,v){
  6.     for(i=0;++i<=length(q);){
  7.         if(q[i]==r[i]){
  8.             rel=get(F1A[i]," ",14)
  9.             little=get(F2A[i]," ",2)
  10.             large=get(F2A[i]," ",3)
  11.             print (rel>little&&rel<large)? v[i]" YES":v[i]" NO"
  12.         }else{
  13.             print v[i]" NO"
  14.         }
  15.     }
  16. }
  17. NR==1&&/^ch/{f=NF>5?1:0}
  18. NF>5&&/^ch/{F1[FNR]=get($(NF-5),"_",1);F1A[FNR]=$0}NF<5{F2[FNR]=get($NF,"_",2);F2A[FNR]=$0}
  19. END{
  20.     if(f){
  21.         pp(F1,F2,F1A)
  22.     }else{
  23.         pp(F2,F1,F2A)
  24.     }
  25. }' a b
复制代码

评分

参与人数 1信誉积分 +7 收起 理由
catloverat99 + 7 非常感谢!!

查看全部评分

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-10-29 06:20:00
6 [报告]
发表于 2015-11-26 18:38 |只看该作者
本帖最后由 catloverat99 于 2015-11-26 19:17 编辑

回复 3# tc1989tc


刚才试着运行了一下,结果发现如果不同的 ENS ID 如果范围相同,结果也变成yes. 我需要先保证id相同的情况下,看file 1是否在file 2的范围。麻烦大神,再给看看。下面是运行结果。

file1的结果
value.V1        value.V2        value.V3        value.V4        value.V5        value.V6        value.V7        value.V8        value.V9        chromosome        start        end        dmr_length        rel_pos
chr1        17618115        T        C        CC        CC        TT        TT        ENSRNOG00000013436_451        chr1        17617848        17618216        369        268  YES
chr1        17618162        A        C        CC        CC        AA        AA        ENSRNOG00000013436_451        chr1        17617848        17618216        369        315  YES
chr1        24197584        A        G        GG        GG        AG        AG        ENSRNOG00000016371_102        chr1        24197021        24198790        1770        564  NO
chr1        24197597        C        T        TT        TT        CT        CT        ENSRNOG00000016371_102        chr1        24197021        24198790        1770        577  NO
chr1        24197733        G        C        CC        CC        GC        GG        ENSRNOG00000016371_102        chr1        24197021        24198790        1770        713  NO
chr1        24197750        G        A        AA        AA        GG        GG        ENSRNOG00000016371_102        chr1        24197021        24198790        1770        730  NO

file2的结果,倒数第二行也是yes. 这应该是匹配了范围,没有考虑id的结果
V$GLI_Q3 267 346 g2_ENSRNOG00000013436_451  YES
V$GKLF_Q4 345 351 g2_ENSRNOG00000013436_451  NO
V$IK_Q5_01 345 351 g2_ENSRNOG00000013436_451  NO
V$TTF1_Q5_01 347 353 g2_ENSRNOG00000013436_451  NO
V$COE1_Q6 347 360 g2_ENSRNOG00000013436_451  NO
V$TBX5_01 13 24 g2_ENSRNOG00000016371_102  NO
V$RBPJK_01 27 37 g2_ENSRNOG00000016371_102  NO
V$DR4_Q2 34 50 g2_ENSRNOG00000016371_102  NO
V$BBX_04 267 346 g2_ENSRNOG00000016371_102  YES
V$BBX_04 118 134 g2_ENSRNOG00000016371_102  NO


论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-10-29 06:20:00
7 [报告]
发表于 2015-11-26 18:55 |只看该作者
回复 5# haooooaaa


  结尾的a 和 b是要换成我的文件名file1 file2?抱歉我的水平太有限。

论坛徽章:
54
2015亚冠之德黑兰石油
日期:2015-07-07 13:00:1615-16赛季CBA联赛之深圳
日期:2016-03-31 09:03:5415-16赛季CBA联赛之辽宁
日期:2016-05-09 20:38:15程序设计版块每日发帖之星
日期:2016-05-12 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-13 15:19:4715-16赛季CBA联赛之福建
日期:2016-05-15 20:24:34每日论坛发贴之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之吉林
日期:2016-05-26 11:49:4715-16赛季CBA联赛之广东
日期:2016-05-26 13:49:18极客徽章
日期:2016-12-07 14:05:2315-16赛季CBA联赛之广夏
日期:2016-12-20 17:33:532017金鸡报晓
日期:2017-01-10 15:19:56
8 [报告]
发表于 2015-11-26 19:02 |只看该作者
回复 7# catloverat99


    是

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-10-29 06:20:00
9 [报告]
发表于 2015-11-26 19:16 |只看该作者
回复 8# haooooaaa

结果怎么都是no?


V$GLI_Q3 267 346 g2_ENSRNOG00000013436_451 NO
V$GKLF_Q4 345 351 g2_ENSRNOG00000013436_451 NO
V$IK_Q5_01 345 351 g2_ENSRNOG00000013436_451 NO
V$TTF1_Q5_01 347 353 g2_ENSRNOG00000013436_451 NO
V$COE1_Q6 347 360 g2_ENSRNOG00000013436_451 NO
V$TBX5_01 13 24 g2_ENSRNOG00000016371_102 NO
V$RBPJK_01 27 37 g2_ENSRNOG00000016371_102 NO
V$DR4_Q2 34 50 g2_ENSRNOG00000016371_102 NO
V$BBX_04 117 133 g2_ENSRNOG00000016371_102 NO
V$BBX_04 267 346 g2_ENSRNOG00000016371_102 NO

论坛徽章:
54
2015亚冠之德黑兰石油
日期:2015-07-07 13:00:1615-16赛季CBA联赛之深圳
日期:2016-03-31 09:03:5415-16赛季CBA联赛之辽宁
日期:2016-05-09 20:38:15程序设计版块每日发帖之星
日期:2016-05-12 06:20:0015-16赛季CBA联赛之四川
日期:2016-05-13 15:19:4715-16赛季CBA联赛之福建
日期:2016-05-15 20:24:34每日论坛发贴之星
日期:2016-05-16 06:20:0015-16赛季CBA联赛之吉林
日期:2016-05-26 11:49:4715-16赛季CBA联赛之广东
日期:2016-05-26 13:49:18极客徽章
日期:2016-12-07 14:05:2315-16赛季CBA联赛之广夏
日期:2016-12-20 17:33:532017金鸡报晓
日期:2017-01-10 15:19:56
10 [报告]
发表于 2015-11-26 19:18 |只看该作者
回复 9# catloverat99


    我测试,file2 第一个是YES,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP