免费注册 查看新帖 |

Chinaunix

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

求替换snp位点的脚本 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-01-22 22:06 |只看该作者 |倒序浏览
本帖最后由 yang7473453 于 2015-01-23 12:19 编辑

现有两个文件,一个是fasta文件,一个snp位点信息文件,如下
文件一:
>gh2222
TTTTTTAAAAAAAAAAGGGGGGCCCCCCCCCAAAAAA
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
>gh2242
TTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAGGGGGGG
CCCCCCCCCCCCCTT

文件二:
基因号       位置      snp碱基
gh2222         5              A
gh2222         22            A
gh2222         9              G
gh2242         15            C

需要根据文件二中的信息将文件中相应的snp位点替换掉,生成新的替换后的文件,求perl脚本!

论坛徽章:
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
2 [报告]
发表于 2015-01-22 23:01 |只看该作者
substr......

论坛徽章:
0
3 [报告]
发表于 2015-01-23 09:24 |只看该作者
大神,可以具体一点吗?回复 2# huang6894


   

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2015-01-23 14:47 |只看该作者
位置是从1开始算还是从0开始算, 文件中:
TTTTTTAAAAAAAAAAGGGGGGCCCCCCCCCAAAAAA
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
只要替换第一行的还是两行都要?文件的具体格式是不是都是两行组成的?

问题描述不清,则无法回答.
你要给个简单的例子说明你要想的结果.

论坛徽章:
0
5 [报告]
发表于 2015-01-23 15:21 |只看该作者
位置从0开始算,序列不管有几行都把它当连续的一段来看回复 4# ntwarren


   

论坛徽章:
0
6 [报告]
发表于 2015-01-23 17:46 |只看该作者
给你一个具体一点的,文件一:
>gg22
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
>gg23
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
>gg25
GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG

文件二:      位置信息是按同一个序列的所有碱基计算的
序列名       位置       碱基
gg22             5             T
gg22             15           T
gg25             8             A

需要生成的文件:   文件三
>gg22
AAAATAAAAAAAAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
>gg23
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
>gg25
GGGGGGGAGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
            
文件一中每个序列的行数不一样,根据文件二中的信息将文件一中相应的位置替换碱基,
没有替换过的序列就按文件一中的再次输出一遍,得到替换碱基后的文件三。不知道脚本要怎么写?

回复 4# ntwarren


   

论坛徽章:
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
7 [报告]
发表于 2015-01-23 18:52 |只看该作者
  1. awk -v RS=">" -v OFS="\n"  'FNR==NR{for (i=4;i<=NF;i+=3) if($i~/[0-9a-Z]/)a[$i]=$(i+1)"#"$(i+2)"#"a[$i];next}NR>FNR&&FNR>1{
  2. > if(a[$1]){split(a[$1],b,"#");split($2,c,"");for(j=1;j<=length(c);j++){for(s=1;s<=length(b);s+=2) if(j==b[s]) c[j]=b[s+1]}
  3. > for (k=1;k<=length(c);k++){t=t c[k];$2=t}t=""}}{if($0!~/^$/) print ">"$0}' file2 file1
  4. >gg22
  5. AAAATAAAAAAAAATAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  6. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  7. >gg23
  8. TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
  9. TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
  10. TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT

  11. >gg25
  12. GGGGGGGAGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
复制代码
回复 1# yang7473453 perl不会,上个awk的吧!


   

论坛徽章:
0
8 [报告]
发表于 2015-01-23 20:38 |只看该作者
很感谢您的帮助,只是不懂awk,很抱歉回复 7# zxy877298415


   

论坛徽章:
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 [报告]
发表于 2015-01-23 22:28 |只看该作者
  1. #!/usr/bin/perl -w
  2. my($fa, $snp) = @ARGV;
  3. my %hash;
  4. open SNP,"< $snp" or die "$!";
  5. while(<SNP>){
  6.         chomp;
  7.         my($chr, $pos, $mut) = split;
  8.         push @{ $hash{$chr} },{ P => $pos, M => $mut };
  9. }
  10. close SNP;

  11. $/ = '>';
  12. open FA,"< $fa" or die "$!";
  13. <FA>;
  14. while(<FA>){
  15.         chomp;
  16.         my ( $CHR, @SEQ ) = split;
  17.         unless(exists $hash{$CHR}){
  18.                 print ">".$_;
  19.                 next;
  20.         }
  21.         my $SEQ = join '', @SEQ;
  22.         for my $C ( @{ $hash{$CHR} } ) {
  23.                 substr( $SEQ, $C->{P}, 1 ) = $C->{M};
  24.         }
  25.         print ">$CHR\n$SEQ\n";
  26. }
  27. close FA;
  28. $/ = '\n';

复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2015-01-24 14:44 |只看该作者
用这个吧, 能保留你每一小段的换行风格不变.

use strict;
use warnings;

open FILE1, "<", "file1.txt";
open FILE2, "<", "file2.txt";
open FILE3, ">", "file3.txt";

my @file2 = map {chomp; [split /\s+/] } <FILE2>;

our $name;
our $content;

while(<FILE1>){
    if(/^>(\w+)/){
        if(defined($name)){
            for my $a (@file2){
                if($a->[0] eq $name){
                    my @totalLineFeed = substr($content,0,$a->[1]) =~ /\n/g;
                    substr($content,$a->[1]-1 + @totalLineFeed,1)=$a->[2];
                }
            }
            print FILE3 ">".$name."\n".$content;
            
        }
        $name = $1;
        $content = "";
    } else {
        $content .= $_;
    }
}


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP