免费注册 查看新帖 |

Chinaunix

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

[文本处理] awk对于两文本数据比较的优化问题? [复制链接]

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-05 15:47 |只看该作者 |倒序浏览
额,小白第一帖过来是问问题的~跪求各位大大不吝赐教~谢过谢过~

我想比较两个文件,它们的元素是不对等的,第二个文件中第二列($ling_2[1])和第一个文件的第二第三列为数字($ling_1[1]\$ling_1[2]),两个文件的第一列均为染色体编号,一个编号对应多组数字。
我的需求是:我想找到第一个文件上和第二个文件的染色体编号相同,且第二个文件的数字是在第一个文件两个数字之间的,即$ling_1[1]<=$ling_2[1]<=$ling_1[2].把符合条件的输出到新的文件,怎么搞?
————————————————————————————————————————————————————————————————————————
我的输入文件:
1、filter_allgene.txt
chr1    107543234       107546786       (ABCA1|NM_005502|-|3-UTR3).u-50d+50e;(ABCA1|NM_005502|-|CDS49).u-50d+50e
chr1    107547627       107547970       (ABCA1|NM_005502|-|CDS4.u-50d+50e
chr1    107548529       107548721       (ABCA1|NM_005502|-|CDS47).u-50d+50e
chr1    107549104       107549307       (ABCA1|NM_005502|-|CDS46).u-50d+50e
chr9    107550151       107550385       (ABCA1|NM_005502|-|CDS45).u-50d+50e
chr9    107550657       107550898       (ABCA1|NM_005502|-|CDS44).u-50d+50e
chr9    107553153       107553359       (ABCA1|NM_005502|-|CDS43).u-50d+50e
chr9    107554167       107554329       (ABCA1|NM_005502|-|CDS42).u-50d+50e
chr9    107555017       107555237       (ABCA1|NM_005502|-|CDS41).u-50d+50e
2、dbSNP_hg19.chr.All
chr1    93617546        1       1       0       0       0.888   0.112   0       rs546
chr1    15546825        1       1       0       0.261   0       0       0.739   rs549
chr1    203713133       1       1       0       0.181   0       0       0.819   rs568
chr1    24181041        1       1       0       0.007   0       0       0.993   rs665
chr1    53679329        0       0       0       0.01    0       0       0.01    rs672
chr1    173876561       1       1       0       0       0.5     0       0.5     rs677
chr1    161191522       1       1       0       0       0.302   0.698   0       rs685
chr1    230845794       0       1       0       0.01    0       0       0.01    rs699
chr1    233971983       1       1       0       0       0.01    1.0     0       rs701
chr1    32372139        1       0       0       0       1.0     0.01    0       rs717
chr1    34061688        0       1       0       0       0.01    0       0.01    rs737
chr1    173120583       1       1       0       0       0       0.75    0.25    rs750
chr1    87857969        1       1       0       0.162   0       0       0.838   rs751
chr1    214859676       1       1       0       0.433   0       0       0.567   rs759
chr9    107543239       0       1       0       0       0.01    0.01    0       rs171
chr9    107549144       1       1       0       0       0.833   0.167   0       rs538
____________________________________________________________________________________________

我的处理是:awk -F'\t' 'NR==FNR{a[FNR]=$1;b[FNR]=$2;c[FNR]=$3;num=FNR}NR>FNR{for(i=1;i<=num;i++){if(($1==a[i])&&($2<=c[i])&&($2>=b[i])){print $0}}}' filter_allgene.txt dbSNP_hg19.chr.All >>result_again.txt
————————————————————————————————————————————————————————————————————
可是有个问题就是这样子做会超出我的系统内存,有没有其他的处理方法可以实现呢?

{:3_200:} 谢谢了



论坛徽章:
0
2 [报告]
发表于 2013-08-05 15:59 |只看该作者
本帖最后由 todayhero 于 2013-08-05 16:00 编辑

@huang6894

导到mysql数据中,进行select查找,这方法可行吧!

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
3 [报告]
发表于 2013-08-05 16:04 |只看该作者
回复 2# todayhero


    大大,这个,这个。。。太高端了~是可以实现,不过还得专门弄个数据库,就。。。额。。。额

论坛徽章:
0
4 [报告]
发表于 2013-08-05 16:11 |只看该作者
不用数组或把大文件拆成小文件

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
5 [报告]
发表于 2013-08-05 16:13 |只看该作者
回复 4# whoislp

震惊!!!分拆!!有道理!!!!求具体实现,split?然后呢?
   

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

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
7 [报告]
发表于 2013-08-05 16:27 |只看该作者
回复 6# zooyo


    额,额,不好意思。。。一直是看客。。这是第一次发帖~

论坛徽章:
0
8 [报告]
发表于 2013-08-05 16:41 |只看该作者
楼主给的demo数据,是不是不存在匹配ok的目的数据?

论坛徽章:
8
技术图书徽章
日期:2013-08-22 11:21:28未羊
日期:2015-01-19 22:22:25巳蛇
日期:2014-08-11 16:53:08子鼠
日期:2014-05-29 09:04:44摩羯座
日期:2014-04-11 14:15:07丑牛
日期:2014-01-24 12:41:28金牛座
日期:2013-11-21 17:38:28射手座
日期:2015-01-21 08:50:32
9 [报告]
发表于 2013-08-05 16:44 |只看该作者
本帖最后由 huang6894 于 2013-08-05 16:45 编辑

回复 8# zxd_echo


    我就是给出一个格式。。。。是希望找到两个文件位于第一列的数字相同,然后位于第二个文件的第二列的数字在第一个文件第二、三列的数字之间的信息。。。。
谢谢这位大大。。。

至于上面的,我特地改了几个数字,按道理第二个文件的最后两行应该被输出

论坛徽章:
0
10 [报告]
发表于 2013-08-05 16:47 |只看该作者
回复 9# huang6894


    如果不考虑效率的话,试试
#!/bin/awk -f
func find_num(num,str){
        while((getline < ARGV[2])){
                if(num >= $2 &&num <= $3 && $1 == str)
                        print $0
        }
        close(ARGV[2])
}
{
        if(NR==FNR)
                find_num($2,$1)
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP