免费注册 查看新帖 |

Chinaunix

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

想批量对文本指定位置替换 [复制链接]

论坛徽章:
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)] [报告]
发表于 2014-04-01 09:48 |只看该作者 |倒序浏览
本帖最后由 huang6894 于 2014-04-08 19:26 编辑

======楼猪也是生物工程的========

大神们好:
我想对一个文本的数据(文本二)按照文本一的规则进行批量更新,文本一有五列,第二列是相对于第一列(设定为$a)的起始坐标,第三列则是终止坐标,第四列是要替换的字符,第五列是替换后的字符,针对的是文本二(文本二以>为段落分隔符,每段中第一行是描述,第二行是要处理的对应的字符串)中描述部分以‘>$a:’开始的对应的字符串。。。
-----------------------------------------
这样的,文本二中:>chr1:2336191-2337323表示下一行的【TCGA...】是chr1这个key2336191至2337323位,我如果想批量定位替换这样好实现吗?
比如:文本一是:chr1    2337223        2337224        A       G 就把>chr1:2336191-2337323下面的value字符串第(2337223-2336191+1)位由A变G。。。
如果是:chr1    2338106        2338108        TT       G就跳过>chr1:2336191-2337323部分处理>chr1:2337873-2338108下面的value字符串第(2338106-2336191+1)位到第(2338107-2336191+1)位的TT变成G
如果是:chr1    2338109        2338110        GT       G就跳过不对文本处理,因为找不到chr1符合2338109        2338110  范围的。。。
如果是:chr1    2338106        2338110        TTGT       G就跳过>chr1:2336191-2337323部分处理>chr1:2337873-2338108下面的value字符串第(2338106-2336191+1)位到第(2338108-2336191+1)位的TTG变成G(因为这里chr1最大值是2338108)
------------------------------------------

sample:
文本一:
  1. chr1    2       3       N       A
  2. chr1    4       7       NNN     T(注意这里,如果4-7分配到两个区域,改变发生区域以其实坐标“4”为准)
  3. chr2    3      4      N       GGGGG
  4. chr2     7      10   TGG    A
复制代码
文本二
  1. >chr1:1-5
  2. TNGNN
  3. >chr1:6-15
  4. NTG
  5. >chr2:1-8
  6. TTNCCTTG
复制代码
得到的结果:

  1. >chr1:1-5
  2. TAGT(也就是4-5的N变成了T)
  3. >chr1:6-15
  4. TG(6位的N删除了)
  5. >chr2:1-8
  6. TTGGGGGCCTA(计算的时候如果前面的位置已经发生过突变了,比如‘chr2     7      10   TGG    A’应该是改变原来文本上的第7位-第9位的TGG 为N,但是前面‘chr2    3      4      N       GGGGG‘这里的变化使得增加了4位,后面‘chr2     7      10   TGG    A’改变的就相当于改变的是文本的第11位至13位的TGG变成了A,又因为区域只有1-8(发生‘chr2    3      4      N       GGGGG’后变成了1-12,)所以排除了第9位。。
复制代码

论坛徽章:
8
技术图书徽章
日期:2013-09-30 08:51:28技术图书徽章
日期:2013-12-11 09:26:39白羊座
日期:2013-12-27 15:27:13金牛座
日期:2014-01-06 09:13:05天蝎座
日期:2014-01-21 14:23:28酉鸡
日期:2014-05-09 16:51:12卯兔
日期:2014-08-11 16:49:1515-16赛季CBA联赛之八一
日期:2017-08-14 23:24:57
2 [报告]
发表于 2014-04-01 11:18 |只看该作者
这个是不是需要把\n替换掉

论坛徽章:
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 [报告]
发表于 2014-04-01 11:23 |只看该作者
回复 2# xiumu2280


    是的呢~

论坛徽章:
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
4 [报告]
发表于 2014-04-01 16:01 |只看该作者
可耻的up一下。。。。

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
5 [报告]
发表于 2014-04-01 17:09 |只看该作者
本帖最后由 pitonas 于 2014-04-01 10:19 编辑

这个问题有点难

GT变成A
GTGTG => AAG
  1. #!/usr/bin/perl

  2. open my $D1, 'doc1';

  3. my %d1;
  4. while (<$D1>) {
  5.     my ( $chr, $beg, $end, $old, $new ) = split;
  6.     push @{ $d1{$chr} },
  7.       { B => $beg, L => ( $end - $beg + 1 ), O => $old, N => $new };

  8. }

  9. $/ = '>';
  10. <DATA>;

  11. while (<DATA>) {
  12.     /^\w+/ and exists( $d1{$&} ) or next;
  13.     my ( $CHR, @SEQ ) = split;
  14.     pop @SEQ if $SEQ[-1] eq '>';
  15.     my $SEQ = join '', @SEQ;
  16.     for my $C ( @{ $d1{$CHR} } ) {
  17.         my $sub = substr $SEQ, $C->{B}, $C->{L};
  18.         $sub =~ s/$C->{O}/$C->{N}/g;
  19.         substr( $SEQ, $C->{B}, $C->{L} ) = $sub;
  20.     }
  21.     print ">$CHR\n$SEQ\n";
  22. }

  23. __DATA__
  24. >chr1
  25. AGGGTGGTTGGTGGGAAACCCTGGTTCCCCCAGCCCCCGGAGACTTAAAT
  26. ACAGGAAGAAAAAGGCAGGACAGAATTACAAGGTGCTGGCCCAGGGCGGG
  27. >chr2
  28. AGGGTGGTTGGTGGGAAACCCTGGTTCCCCCAGCCCCCGGAGACTTAAAT
  29. ACAGGAAGAAAAAGGCAGGACAGAATTACAAGGTGCTGGCCCAGGGCGGG
  30. >chrx
  31. AGGGTGGTTGGTGGGAAACCCTGGTTCCCCCAGCCCCCGGAGACTTAAAT
  32. ACAGGAAGAAAAAGGCAGGACAGAATTACAAGGTGCTGGCCCAGGGCGGG
复制代码

论坛徽章:
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
6 [报告]
发表于 2014-04-01 17:13 |只看该作者
回复 5# pitonas


    大神。。。请允许我膜拜一下
谢谢,谢谢

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
7 [报告]
发表于 2014-04-01 17:35 |只看该作者
chr1   0 5  GT  A
chr1   6 7  A  T

GTGTAAAAAA => AAAAAAAA  # 0 .. 5 (length changed!)
AAAAAAAA   => AAAAAATT  # 6 ..7 new pos
or
GTGTAAAAAA  => GTGTATTAAA # 6 ..7
GTGTATTAAA  => AAATTAAA   # 0 .. 5

输出结果不同

AAAAAATT != AAATTAAA

论坛徽章:
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
8 [报告]
发表于 2014-04-01 17:46 |只看该作者
回复 5# pitonas


    测试后回来,麻烦吐司哥提示一下怎么改~
就是:
  1. chr1    1       2       N       A
  2. chr1    4       7       NNN     T
  3. chr1    13      14      N       GGGGG
复制代码
测试文本:
  1. >chr1
  2. NBNNNNCNNNNDNENNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
  3. NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
复制代码
按道理我想要得到的是:
  1. >chr1
  2. ABNTCNNNNDGGGGGENNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
复制代码
大神的结果是:
  1. >chr1
  2. NANNTNNNNDNNGGGGGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
复制代码
不过如果像大神这样做的话,计算的时候之前的位置就改变了,比如‘chr1    13      14      N       GGGGG’应该是改变原来文本上的第13位的N为GGGGG,但是‘chr1    4       7       NNN     T‘这里的变化使得缺了两位,后面‘chr1    13      14      N       GGGGG’改变的就相当于之前文本的第15位的N了。。

论坛徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午马
日期:2014-08-06 03:56:58
9 [报告]
发表于 2014-04-01 18:37 |只看该作者
本帖最后由 pitonas 于 2014-04-01 13:18 编辑

{:2_172:}麻烦94大神测试测试
  1. #!/usr/bin/perl

  2. open my $D1, 'doc1';

  3. my %chrs;
  4. while (<$D1>) {
  5.     my ( $chr, $beg, $end, $old, $new ) = split;
  6.     push @{ $chrs{$chr} },
  7.       {
  8.         P => ( $beg - 1 ),
  9.         L => ( $end - $beg ),
  10.         O => $old,
  11.         N => $new
  12.       };
  13. }

  14. $/ = '>';
  15. <DATA>;

  16. while (<DATA>) {
  17.     #/^\w+/ and exists( $d1{$&} ) or next;
  18.     my ( $CHR, @SEQ ) = split;
  19.     pop @SEQ if $SEQ[-1] eq '>';
  20.     my $SEQ = join '', @SEQ;
  21.     my $move = 0;
  22.     for my $C ( @{ $chrs{$CHR} } ) {
  23.         my $pos = $C->{P} + $move;
  24.         my $sub = substr $SEQ, $pos, $C->{L};
  25.         my $tr  = $sub =~ s/$C->{O}/$C->{N}/g;
  26.         substr( $SEQ, $pos, $C->{L} ) = $sub;
  27.         $move -= ( length( $C->{O} ) - length( $C->{N} ) ) * $tr;
  28.     }
  29.     print ">$CHR\n$SEQ\n";
  30. }


  31. __DATA__
  32. >chr1
  33. NBNNNNCNNNNDNENNN
  34. CCCCCCCCCCCCCCCCC
  35. >chrx
  36. 12345
复制代码

论坛徽章:
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
10 [报告]
发表于 2014-04-01 19:03 |只看该作者
回复 9# pitonas


    哈哈~吐司哥,测试之后是这样的
chr12   121176082       121176083       G       A就是把第121176082位的G(只有1位)变成A;
所以我把L => ( $end - $beg + 1 )变成了L => ( $end - $beg  ),不然结果会double出现。。。变成121176082的G以及121176083的G都会变成A

真的非常感谢吐司哥~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP