1

我正在尝试修改这样设置的文件:

chr start   ref alt 
chr1    18884   C   CAAAA
chr1    135419  TATACA  T
chr1    332045  T   TTG
chr1    453838  T   TAC
chr1    567652  T   TG
chr1    602541  TTTA    T
chr1    614937  C   CTCTCTG
chr1    654889  C   CA
chr1    736800  AC  A

我想修改它:如果列“ref”是一个字符串 >1(即第 2 行),那么我生成 2 个新列,其中:

第一个新列 = 起始坐标-1 第二个新列 = 起始坐标+(参考字符串的长度)+1

因此,第 2 行的输出如下所示:

chr1 135419 TATACA T 135418 135426

或: 如果 "ref" 中的字符串长度 = 1 并且列 "alt"=长度>1 的字符串(即第 1 行),则

第一个新列 = 起始坐标 第二个新列 = 起始坐标+2

因此,第 1 行的输出将是:

chr1 18884 C CAAAA 18884 18886

我在 awk 中尝试过,但没有成功我的 perl 不存在,但这会是最好的方法吗?或者也许在 R 中?

4

3 回答 3

2

这是使用awk. 像这样运行:

awk -f script.awk file | column -t

内容script.awk

NR==1 {
    next
}

length($3)>1 && length($4)==1 {
    print $0, $2-1, $2+length($3)+1
    next
}

length($3)==1 && length($4)>1 {
    print $0, $2, $2+2
    next
}1

结果:

chr1  18884   C       CAAAA    18884   18886
chr1  135419  TATACA  T        135418  135426
chr1  332045  T       TTG      332045  332047
chr1  453838  T       TAC      453838  453840
chr1  567652  T       TG       567652  567654
chr1  602541  TTTA    T        602540  602546
chr1  614937  C       CTCTCTG  614937  614939
chr1  654889  C       CA       654889  654891
chr1  736800  AC      A        736799  736803

或者,这是单线:

awk 'NR==1 { next } length($3)>1 && length($4)==1 { print $0, $2-1, $2+length($3)+1; next } length($3)==1 && length($4)>1 { print $0, $2, $2+2; next }1' filem | column -t

代码应该是不言自明的。脚本末尾的1仅启用每行的默认打印(即“1”返回真)。HTH。

于 2013-02-04T09:04:03.513 回答
2

Perl 解决方案。请注意,您的规范没有提到如果两个字符串的长度都为 1 时该怎么做。

#!/usr/bin/perl
use warnings;
use strict;
use feature qw(say);

#use Data::Dumper;
<DATA>; # Skip the header;
while (<DATA>) {
    my ($chr, $start, $ref, $alt) = split;
    my @cols;
    if (1 < length $ref) {
          @cols = ( $start - 1, $start + 1 + length $ref);
    } elsif (1 < length $alt) {
        @cols = ($start, $start + 2);
    } else {
        warn "Don't know what to do at $.\n";
    }
    say join "\t", $chr, $start, $ref, $alt, @cols;
}


__DATA__
chr start   ref alt
chr1    18884   C   CAAAA
chr1    135419  TATACA  T
chr1    332045  T   TTG
chr1    453838  T   TAC
chr1    567652  T   TG
chr1    602541  TTTA    T
chr1    614937  C   CTCTCTG
chr1    654889  C   CA
chr1    736800  AC  A
于 2013-02-04T09:08:29.337 回答
0

在 perl 中这样做是微不足道的(但在 awk 中也是如此):

#!/usr/bin/perl
while (<>) {
  chmop;
  my ($chr,$start,$ref,$alt)=split(/\s+/,$_);
  if (len($ref) > 1) {
print STDOUT
  "$chr\t$start\t$ref\t$alt\t",
    $start+len($ref)+1,"\n";
  } elsif (len($ref)==1) {
print STDOUT
  "$chr\t$start\t$ref\t$alt\t",
    $start+2,"\n";
  } else {
print STDERR "ERROR: ???\n"; #actually impossible
  }
}

将其粘贴到文件 morecols.pl 中,chmod +x morecols.pl,运行 morecols.pl。(请注意,此代码/说明中有很多假设)。我感觉您的实际问题更多是编程/文本处理,而不是工具或语言。如果是这样,此代码只是权宜之计....

干杯。

于 2013-02-04T09:08:12.970 回答