免费注册 查看新帖 |

Chinaunix

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

[文本处理] 求比较一个文件一个值是否落在另一个文件的范围内 [复制链接]

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-10-29 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-10-23 09:26 |只看该作者 |倒序浏览
新手,请教各位大神,我要看
file1最后一列 rel_pos的值是否落在另一个文件file2中的区间(例如第一行 267为起点 346为钟点)。
ENSRNOG000000xx1是不同的ID,是两个文件都含有的.
最后输出 以file2为主,将file1 的值[ chr1        17618115        T        C        CC        CC        TT        TT        ENSRNOG00000013436_451        chr1        17617848        17618216        369        268]填到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
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

论坛徽章:
39
辰龙
日期:2013-08-21 15:45:192015亚冠之广州富力
日期:2015-05-12 16:34:52亥猪
日期:2015-03-03 17:22:00申猴
日期:2015-03-03 17:21:37未羊
日期:2014-10-10 13:45:41戌狗
日期:2014-06-17 09:53:29巨蟹座
日期:2014-06-12 23:17:17双鱼座
日期:2014-06-10 12:42:44寅虎
日期:2014-06-09 12:52:172015亚冠之卡尔希纳萨夫
日期:2015-05-24 15:24:35黄金圣斗士
日期:2015-12-02 17:25:0815-16赛季CBA联赛之吉林
日期:2017-06-24 16:43:52
2 [报告]
发表于 2015-10-23 10:40 |只看该作者
一对多的情况怎么处理?

论坛徽章:
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
3 [报告]
发表于 2015-10-23 10:58 |只看该作者
本帖最后由 jason680 于 2015-10-23 10:59 编辑

$ awk 'FNR==NR{a[$NF]=$0;next}{for(n in a)if($2<=+n&&+n<=$3)$0=$0" "a[n]}1' file1 file2
V$GLI_Q3 267 346 g2_ENSRNOG00000013436_451 chr1        17618162        A        C        CC        CC        AA        AA        ENSRNOG00000013436_451        chr1        17617848        17618216        369        315 chr1        17618115        T        C        CC        CC        TT        TT        ENSRNOG00000013436_451        chr1        17617848        17618216        369        268
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信誉积分 +5 收起 理由
catloverat99 + 5 很给力!

查看全部评分

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-10-29 06:20:00
4 [报告]
发表于 2015-10-23 12:42 |只看该作者
回复 3# jason680


谢谢楼上各位的回复。实在抱歉,确实没考虑周全,1对多的情况没考虑进去。现在,我想在file 1后加一列(Yes/No),告诉file 1的rel_pos是不是落在file2上,只要有一个即为yes,另外在file 2后面加一列告诉file2的区间包不包括file1的值,只要有一个即为yes。这样应该可行吧?

结果应该是这样:
file1

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
。。。
fie 2

V$GLI_Q3 267 346 g2_ENSRNOG00000013436_451 Yes
V$GKLF_Q4 345 351 g2_ENSRNOG00000013436_451 NO

....

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-10-29 06:20:00
5 [报告]
发表于 2015-10-23 13:05 |只看该作者
回复 2# 关阴月飞

这种情况确实不好处理,我现在改成末尾加yea/NO


   

论坛徽章:
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
6 [报告]
发表于 2015-10-23 13:46 |只看该作者
回复 4# catloverat99

$ 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
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 117 133 g2_ENSRNOG00000016371_102 No
V$BBX_04 118 134 g2_ENSRNOG00000016371_102 No

   

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-10-29 06:20:00
7 [报告]
发表于 2015-10-24 07:54 |只看该作者
回复 6# jason680

非常感谢,回头试一下
   

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


大神,再请教一下,这里是不是没考虑 id的匹配,也就是file 1的ENSRNOGxxx 要与第二个文件的ENSRNOGxxx匹配上后,才考虑file1最后一行是否落在file2范围内。

   

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-10-29 06:20:00
9 [报告]
发表于 2015-11-26 11:35 |只看该作者
file1最后一列 rel_pos的值是否落在另一个文件file2中的区间(例如第一行 267为起点 346为钟点)。
ENSRNOG000000xx1是不同的ID,是两个文件都含有的. 注:一定要ID先匹配再考虑范围
最后输出 以file2为主,将file1 的值[ chr1        17618115        T        C        CC        CC        TT        TT        ENSRNOG00000013436_451        chr1        17617848        17618216        369        268]填到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
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

用$ 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的匹配?

请各位大神支招。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP