在bash或R中转换每个第N个字符串的有效方法

时间:2015-04-08 21:22:43

标签: r bash awk fastq

感谢您抽出宝贵时间来研究这个问题。

我有一个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 " $0 "| tr ATGC TACG") }
  else print $0}' MyFastqFyle.fastq > MyDesiredFile.fastq

它有效!但这种方法很好,即使是小文件(250M)也是如此。我想知道哪种方式可以更快地完成,如果这是R或bash或类似的事情并不重要。

(我查看了BioStrings但是我只找到了反向补充功能,而#34; @"在标题中有一些问题而不是">")

2 个答案:

答案 0 :(得分:3)

这很慢,因为你为每个更改的行生成了一个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

应该有用。

答案 1 :(得分:1)

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

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