翻译 bash 或 R 中每个第 N 个字符串的有效方法

Efficient way to TRANSLATE every Nth string in bash or R

感谢您抽出时间来看这篇文章。

我有一个 fastq 文件,我想将它翻译成互补的,而不是反向互补的,像这样:

@Some header example:1:
ACTGAGACTCGATCA
+
S0m3_Qu4l1t13s&

翻译成

@Some header example:1:
TGACTCTGAGCTAGT
+
S0m3_Qu4l1t13s&

而我使用的代码是:

awk '{
  if(NR==100000){break} 
  else if((NR+2) % 4 ==0 ){ system("echo " [=13=] "| tr ATGC TACG") }
  else print [=13=]}' MyFastqFyle.fastq > MyDesiredFile.fastq

而且有效!但是这种方法很慢,即使是小文件(250M)也是如此。我想知道还有哪种方法可以更快地完成这项工作,无论是在 R 还是 bash 或类似的方法中。

(我查看了BioStrings 但我只发现了反向互补函数,并且header中的“@”而不是“>”存在一些问题

这很慢,因为您为每个更改的行生成一个 shell 和一个进程。只需使用 sed:

sed '2~4 y/ATGC/TACG/' MyFastqFyle.fastq > MyDesiredFile.fastq

这需要 GNU sed,所以我希望你没有在 Mac OS X 上。如果你在,

sed 'n; y/ATGC/TACG/; n; n' MyFastqFyle.fastq > MyDesiredFile.fastq

应该可以。

这是使用 Biostrings(和 ShortRead)的解决方案:

library(ShortRead)
raw <- sread(readFastq("MyFastqFyle.fastq"))
complemented <- complement(raw)