免费注册 查看新帖 |

Chinaunix

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

[文本处理] awk 处理两个文件比较复杂的比较不知道可不可以做到 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2014-12-11 14:11 |只看该作者
回复 20# Treywea

无所谓了,这是一种投机取巧的方法,实在不行就用楼上的常规方法好了。

论坛徽章:
0
22 [报告]
发表于 2014-12-11 14:16 |只看该作者
回复 19# Looiml


    那怎么保证Chr1的相等呢?而且这个再找出每一个pos之后都需要有一个循环去文件中判断这个数字是不是属于$3和¥$4的范围 找到的在计算 不是按照行来比对就结束了额

论坛徽章:
0
23 [报告]
发表于 2014-12-11 14:18 |只看该作者
回复 21# Looiml


    哎 我在算上面的方法 应该是没有什么问题 可是我的文件很大 一个78M 一个7.5G 我怕服务器会不会算奔溃了。。。

论坛徽章:
0
24
发表于 2014-12-11 14:20
回复 22# Treywea
你可以先好好理解一下join的工作原理:

  1. $>cat a.txt
  2. chr      pos    C  C+T
  3. Chr1   3203945   1   3
  4. Chr1   3203944   0   2
  5. Chr2   32029   2   2
  6. Chr2   3938   0   4
  7. $>cat b.txt
  8. Chr1   exon   3332         30283
  9. Chr1   intro   320       1033939
  10. Chr1   exon   3203944  338383
  11. Chr2   exin    303       3039
  12. Chr2   exon   32029     332020
  13. $>join a.txt b.txt
  14. Chr1 3203945 1 3 exon 3332 30283
  15. Chr1 3203945 1 3 intro 320 1033939
  16. Chr1 3203945 1 3 exon 3203944 338383
  17. Chr1 3203944 0 2 exon 3332 30283
  18. Chr1 3203944 0 2 intro 320 1033939
  19. Chr1 3203944 0 2 exon 3203944 338383
  20. Chr2 32029 2 2 exin 303 3039
  21. Chr2 32029 2 2 exon 32029 332020
  22. Chr2 3938 0 4 exin 303 3039
  23. Chr2 3938 0 4 exon 32029 332020
复制代码

论坛徽章:
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
25 [报告]
发表于 2014-12-11 14:42 |只看该作者
回复 23# Treywea

try this way that you can see the matched items by P(print) value

$ awk -vP=1 'FNR==NR{if($2=="exon"){C=++c[$1];s[$1,C]=$3;e[$1,C]=$4}next}{C=c[$1];if(C)for(n=1;n<=C;n++){if(s[$1,n]<=$2&&$2<=e[$1,n]){m+=$3;a+=$4;n=C;if(P)print $0,"m="m,"all="a}}}END{print "m="m,"all="a}' b.gff3 a.txt
Chr1   1006    1   3 m=1 all=3
Chr1   1007    0   2 m=1 all=5
Chr1   2939    3   5 m=4 all=10
Chr1   35234   1   1 m=5 all=11
Chr2   3938    0   4 m=5 all=15
m=5 all=15

$ awk -vP=0 'FNR==NR{if($2=="exon"){C=++c[$1];s[$1,C]=$3;e[$1,C]=$4}next}{C=c[$1];if(C)for(n=1;n<=C;n++){if(s[$1,n]<=$2&&$2<=e[$1,n]){m+=$3;a+=$4;n=C;if(P)print $0,"m="m,"all="a}}}END{print "m="m,"all="a}' b.gff3 a.txt
m=5 all=15

   

论坛徽章:
9
2015亚冠之大阪钢巴
日期:2015-06-04 11:47:30丑牛
日期:2015-01-22 15:49:26巳蛇
日期:2015-01-22 10:11:18巨蟹座
日期:2014-11-20 10:55:03天蝎座
日期:2014-11-16 22:10:26处女座
日期:2014-11-16 11:01:10申猴
日期:2014-09-19 11:12:37双鱼座
日期:2014-07-25 10:09:54程序设计版块每日发帖之星
日期:2015-08-24 06:20:00
26 [报告]
发表于 2014-12-11 16:34 |只看该作者
回复 20# Treywea


    可能用的~ 匹配有问题 用楼上 jason680 大神的吧

论坛徽章:
0
27 [报告]
发表于 2014-12-11 20:55 |只看该作者
回复 25# jason680


    感谢大神的回复啊!不过我截取了以小组真实的数据出现了小bug:
                                                                                                                                    ^ syntax error
awk: cmd. line:1: FNR==NR{C=++c[$1];s[$1,C]=$4;e[$1,C]=$5;next;}{C=c[$1];if(C)for(n=1;n<=C;n++){if(s[$1,n]<=$2&&$2<=e[$1,n]){meth+=$7;all+=$6;n=C;}} END {print"meth="meth,"all="all,"ratio="meth/all;}
awk: cmd. line:1:                                                                                                                                                                                      ^ unexpected newline or end of string

还有 能不能给我解释解释大概每个括号里面的都代表什么意思,有点看不太懂额  原谅学杂我吧啊

论坛徽章:
0
28 [报告]
发表于 2014-12-11 21:18 |只看该作者
回复 16# zxy877298415


   白天就想回你了 刚刚又尝试了一遍 还是有问题

qianwen@epilab:/data/Users/qianwen/bsmap-2.74$ awk 'FNR==NR&&/exon/{a[$1]=a[$1]?a[$1]","$4"#"$54"#"$5;next} FNR>1{split(a[$1],b,",";for(i=1;i<=length(b);i++){split(b,c,"#";if(($2>=c[1])&&($2<=c[2])){meth+=$7;all+=$6;}}} END{print meth"\t"all;}' Test2.txt Test1.txt
52      9050.7
我的都是整数 你的不知道为什么算出一个小数,而且数据也不是很对。我用实际的数据 再给你们看看吧 都怪我 一开始想说简化一点可能大家好理解。现在还是要贴全部的

论坛徽章:
30
申猴
日期:2014-04-10 09:43:532015年亚洲杯纪念徽章
日期:2015-03-20 14:40:232015亚冠之阿尔纳斯尔
日期:2015-06-02 18:59:042015亚冠之阿尔希拉尔
日期:2015-06-30 15:22:572015亚冠之大阪钢巴
日期:2015-07-20 10:44:332015亚冠之阿尔纳斯尔
日期:2015-10-28 14:57:5215-16赛季CBA联赛之新疆
日期:2015-12-25 10:18:45黑曼巴
日期:2016-06-26 21:39:5315-16赛季CBA联赛之山西
日期:2016-07-25 21:54:2715-16赛季CBA联赛之北京
日期:2016-10-27 12:07:2315-16赛季CBA联赛之八一
日期:2017-07-07 16:39:0915-16赛季CBA联赛之吉林
日期:2017-09-04 12:14:43
29 [报告]
发表于 2014-12-11 21:25 |只看该作者
本帖最后由 zxy877298415 于 2014-12-11 21:26 编辑

回复 28# Treywea
恩,上点真实数据看看!


   

论坛徽章:
30
申猴
日期:2014-04-10 09:43:532015年亚洲杯纪念徽章
日期:2015-03-20 14:40:232015亚冠之阿尔纳斯尔
日期:2015-06-02 18:59:042015亚冠之阿尔希拉尔
日期:2015-06-30 15:22:572015亚冠之大阪钢巴
日期:2015-07-20 10:44:332015亚冠之阿尔纳斯尔
日期:2015-10-28 14:57:5215-16赛季CBA联赛之新疆
日期:2015-12-25 10:18:45黑曼巴
日期:2016-06-26 21:39:5315-16赛季CBA联赛之山西
日期:2016-07-25 21:54:2715-16赛季CBA联赛之北京
日期:2016-10-27 12:07:2315-16赛季CBA联赛之八一
日期:2017-07-07 16:39:0915-16赛季CBA联赛之吉林
日期:2017-09-04 12:14:43
30 [报告]
发表于 2014-12-11 21:42 |只看该作者
本帖最后由 zxy877298415 于 2014-12-11 21:46 编辑

awk 'FNR==NR&&/exon/{a[$1]=a[$1]?a[$1]","$4"#"$5:$4"#"$5;next}FNR>1{split(a[$1],b,",");
for(i=1;i<=length(b);i++){split(b,c,"#");if(($2>=c[1])&&($2<=c[2])) {m+=$6;all+=$7;}}}END{print "m="m,"all="all}' b.txt a.txt
你对对应该一下列啊!


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP