计算一个特定的连续字符及其出现位置和长度

Bud*_*ian 3 sed awk perl bioinformatics

我有一个序列文件,想用它的出现位置和长度来计算连续字符“N” 假设我有一个mySequence.fasta像这样命名的文件:

>sequence-1
ATCGCTAGCATNNNNNNNNNNNNNNCTAGCATCATGCNNNNNNATACGCATCACANNNNNNNNNCgcatATCAC
Run Code Online (Sandbox Code Playgroud)

和预期的输出应该是这样的:

Position 12 N 14
Position 38 N 6
Position 56 N 9
Run Code Online (Sandbox Code Playgroud)

请帮助我通过awksed提供我的文件名来解决这个问题mySequence.fasta

Sté*_*las 10

你可以用 来做到这一点awk,它的match()设置RSTARTRLENGTH变量对此非常有用:

<mySequence.fasta awk -v C=N '{
  i=0
  while (match($0, C "+")) {
    printf "Position %d %s %d\n", i+RSTART, C, RLENGTH
    i += RSTART+RLENGTH-1
    $0 = substr($0, RSTART+RLENGTH)
  }}'
Run Code Online (Sandbox Code Playgroud)

或者perl使用记录匹配开始和结束的@-@+数组:

perl -ne 'printf "Position %d N %d\n", $-[0]+1, $+[0]-$-[0] while /N+/g'
Run Code Online (Sandbox Code Playgroud)

使用(实验性)正则表达式运算符的另一种稍快(至少在我的版本中perlperl方法:(?{...})

perl -ne '0 while /N(?{$s=pos})N*(?{printf "Position %d N %s\n", $s, pos()-$s+1})/g'
Run Code Online (Sandbox Code Playgroud)

  • @Budding-bioinformatician ,对于 gawk,将语言环境更改为 C (`LC_ALL=C awk...`) 以加快速度(之后我发现性能与 `perl` 相当)。我发现`mawk` 比`gawk` 或`perl` 快得多。如果您像在“perl”中那样在代码中对“N”进行硬编码,则可以进一步加快速度。 (2认同)