免费注册 查看新帖 |

Chinaunix

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

[文本处理] 匹配所有字母前的数字运算--大工程~ [复制链接]

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
31 [报告]
发表于 2013-11-15 16:45 |只看该作者
楼主对要求的解释是在看不懂。

论坛徽章:
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
32 [报告]
发表于 2013-11-15 16:48 |只看该作者
回复 29# yestreenstars


比如:
  1. FCD2FEHACXX:8:1303:20504:42704#79_118   99      chr1    15317774        29      20S33M35S  =       15317807        119     CCGAGAGGCGGAGGTTGCAGTGAGCCTAGGTCGCACCACTGCACTCCAGCCTGGTGACAAAGAGAGACTCTGTGTCAAAAAAAAGAAG        ?@<AA@BAA>A@AA>@AA@B?A@AA@@ABA?B>C@CA@CACC@BACA@CCAACB<AAC?AABABAA@CACAC?C?@@AAAAAAAC@AC        BD:Z:LLLLMMMMLLLLMMLLLLLMLMLMLLLLLMLLLLLLLMLLMLLLLLMMMLLLMMLMLLLLGLMMMMMLLLLMMMMLLLGGGGGGLMLL   MD:Z:11G17A3    PG:Z:MarkDuplicates.4   RG:Z:FAMILY_all XG:i:0  BI:Z:OOOOOOOOOOOOOONOOOOOOOOOOOOOOONOOOOOOOOOOOOOONOOOOOOOONOOOOONNOOOOOOONOOOOOOOONNNNNNNOON   AM:i:29 NM:i:2  SM:i:29 XM:i:2  XO:i:0  MQ:i:29 XT:A:M
复制代码
我希望得到:
20S33M35S:15317774+0=15317774;
20M33M35S:15317774+53=15317827;

  1. @FCD2FEHACXX:8:1303:20504:42704#79_118 _1   20S33M35S  15317774
  2. @FCD2FEHACXX:8:1303:20504:42704#79_118 _1   20S33M35S  15317827
复制代码

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
33 [报告]
发表于 2013-11-15 17:11 |只看该作者
第二题:
  1. awk '{N=$9>0?1:2;s=0;t=$6;gsub(/[0-9]*[^S0-9]/,"",t);l=split(t,a,"S");if(l<3){t=$6;gsub(/[0-9]*(I|S.*)/,"",t);split(t,b,"[DM]");for(i in b)s+=b[i];print $1"_"N,$6,$4+s}else{print $1"_"N,$6,$4;t=$6;gsub(/[0-9]*(I|S$)/,"",t);split(t,b,"[DMS]");for(i in b)s+=b[i];print $1"_"N,$6,$4+s}}'
复制代码

论坛徽章:
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
34 [报告]
发表于 2013-11-15 17:26 |只看该作者
回复 32# yestreenstars


    大哥大哥! 还是那个问题:如果我不想处理那些匹配出来的第10、11列字符数小于10个的,如果小于10个不输出这一行,怎么改呀??
   
   谢谢大大~
   ====================
   深深的挫败感啊~我600多行的perl~

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
35 [报告]
发表于 2013-11-15 17:35 |只看该作者
回复 33# huang6894
第二题没有用到第10、11列吧?如果你问的是第一题,请看28楼~

   

论坛徽章:
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
36 [报告]
发表于 2013-11-15 17:41 |只看该作者
回复 34# yestreenstars


    嗯嗯,大大,是这样的,我就是说因为第一题运算的结果是用于匹配第10、11列嘛~然后我就想这个数如果小于10的话,我就不要这一行了~就是S前面的数字运算结果必须大于10,比较麻烦的是这一次忽略I,D表示加

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
37 [报告]
发表于 2013-11-15 17:50 |只看该作者
回复 35# huang6894
你的意思是要把两种结果合并在一起?如果是请给个案例,看你要什么样的格式~

   

论坛徽章:
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
38 [报告]
发表于 2013-11-15 17:55 |只看该作者
回复 36# yestreenstars


    sorry,大大,我没说清楚,结果我是想生成两个文件的,第一个文件你已经帮我完美解决了~
    第二个文件的话是这个意思:
    比如:
  1. FCD2FEHACXX:8:2301:1875:46038#79_118    99      chr1    112365  0       16M1D70M2S      =       112469  192     CTTCTCCAACCAAATTAGGAACAATTATATGGCCACATAGTATCGAATCAAGTTTATAATTTTAAAATAATTGGGAGATTTTGTTGTT        ?A@@@A@@@A@@AA@ABA@AAAA@A?@@@A$AA@AA@@?A@?@A>@A@AAAA=AA?A@AAAAAAAAA@?A@ABBB@C=@AAAC@AB?A
  2. FCD2FEHACXX:8:1104:6915:94857#79_118    147     chr1    73823   37      4S84M   =       73710   -201    AGCTGTAGAGAGAGGCACCCTTTTTTTTTTTTTTAATTATACTTTAAGTTTTAGGGTACATGTGCACCTTGTGCAGGTTAGTTACATA        ??A?>=<879<>=6/2=AA@AAAAAAAAAAAA?A@A?@@?BAA?BAAAAA?A@@A?@A@@B@AA?ABAAA@BB@@AA@AAA@?@??>@
  3. FCD2FEHACXX:8:2307:11230:38678#79_118   14      chr1    37911759        29      44M4I13M4D8M1I13M5S     =       37911601        -240    CCCTCTGCCTCTCCTTCTCTTTACCTCCCTCCCTCTTTCCCTCTTTCCCTCTCTCTCTCCCTCCCTCTCTTCCTCTCTCTCTCCCTCT        ABA??<@AA?C@A=??CABA@<1AA=AAA>BABAA@?@BBCAC@@=A@A@?=?@A@B=AAA=@AB@C@AA@AB@A?A@A@A@A@@>AA
复制代码
这个还是以第六列(16M1D70M2S\88M\44M4I13M4D8M1I13M5S)这种数字计算,这一次“S”之前所有数字忽略I,D表示加,最后是像16M1D70M2S这样的就是16 +1 + 70 =87;4S84M表示0;44M4I13M4D8M1I13M5S表示:44 + 13 +4 + 8 + 13 =82;得到这个数字(以A表示)之后输出第四列的数字加上这个数字之后的结果:
16M1D70M2S:112365+87=112452;#这个时候S前面的数字运算结果是87>10,所以输出这行
4S84M:73823+0=73823;#这个时候S前面的数字运算结果是0<10,所以不输出这行
44M4I13M4D8M1I13M5S:37911759+82=37911841;#这个时候S前面的数字运算结果是82>10,所以输出这行
最后输出:
@FCD2FEHACXX:8:2301:1875:46038#79_118_1   16M1D70M2S  112452
@FCD2FEHACXX:8:2307:11230:38678#79_118_2  44M4I13M4D8M1I13M5S 37911841  
可以吗?

论坛徽章:
2
白羊座
日期:2013-11-18 19:52:42辰龙
日期:2014-09-07 07:46:06
39 [报告]
发表于 2013-11-15 17:56 |只看该作者
本帖最后由 damcool 于 2013-11-15 21:33 编辑

问题一,可处理多S:
  1. awk '{s=$6;gsub(/[0-9]+D|[0-9]+I|[0-9]+M|S$/,"",s);m=$6;gsub(/[0-9]+S|[0-9]+D/,"",m);n=split(m,a,"[MI]");t=0;if (match(m,"I")) for (i=1;i<=n;i++) t+=a[i];n=split(s,a,"S");for (i=1;i<=n;i++) if (length(substr($10,t,a[i]))>1&& length(substr($11,t,a[i]))>1) printf "%s_%d\n%s\n%s\n%s\n\n",$1,($9>0?1:2),substr($10,t,a[i]),"+",substr($11,t,a[i])}' data
复制代码
问题二,可指定字符串长度(通过strlen指定):
  1. awk -v strlen=10 '{m=$6;gsub(/D/,"I",m);gsub(/[0-9]+S/,"",m);n=split(m,a,"[MI]");t=0;if (match(m,"I")) for (i=1;i<=n;i++) t+=a[i];if (t>strlen) printf "%s_%d\t%s\t%d\n\n",$1,($9>0?1:2),$6,$4+t}' data
复制代码

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
40 [报告]
发表于 2013-11-15 18:06 |只看该作者
回复 37# huang6894
试一下:
  1. awk '{N=$9>0?1:2;s=0;t=$6;gsub(/[0-9]*[^S0-9]/,"",t);l=split(t,a,"S");if(l<3){t=$6;gsub(/[0-9]*(I|S.*)/,"",t);split(t,b,"[DM]");for(i in b)s+=b[i];if(s>=10)print $1"_"N,$6,$4+s}else{print $1"_"N,$6,$4;t=$6;gsub(/[0-9]*(I|S$)/,"",t);split(t,b,"[DMS]");for(i in b)s+=b[i];if(s>=10)print $1"_"N,$6,$4+s}}'
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP