我正在处理来自下一代测序数据的 fastq 文件,其组织如下:
- 第 1 行有关测序机、泳道、“图块”和读数数量的信息
- 第 2 行有关序列的信息
- 第 3 行是符号 + 用作分隔符
- 第 4 行有关读取质量的信息
我想删除第一行第 5 个位置(黑色)中特定数字区间内的所有读数。
下面是要删除 1101 到 1103 之间的读取的示例。输入:
@ST-E00204:114:HHKTJALXX:4:1101:22962:1538_1:N:0:1/1 NGTGTTTTTAATTATTAAGTTTTTTTTTAGTTTTTTAAGGATTTTTATAGTAGTAATAGAAATTTAATTAAGATAGAAAATTTTAAGTGTGGTTAGGATTGTAGTTTTGTTGGTATTATGTTGATTTAGTATAAGTAAAGTTTTGATTTT + AAAAJJJJFJJAJJJJAJAJJJJJJJJJJAJJ-FJJJJF--FJJJJFJJJFFJJJFFJ-JJJJFFFFJ-AJ7AJJJJJJJJJFJJJJFJFAJFFJJF-AAFAJFJJ7AJAJJFJFJJJ7FFFFFJFJJ-7F-77A JF--7FJJ @ST-E00204:114:HHKTJALXX:4:1102:7101:2012 2:N:0:1 NATTTAAAAATACCCACTATAAAACATAAAATATAACAAAAAAACTAAAAATCATAAAAAATAAAAAAAATCCACTTCACGTCTTTTAACAATTTCGTCATTTTTAACATCCTCAAATAAATTATTCTCATTTTCCATAACTTCCAATTTT + !AA-FJJJJJJ-FJAJFJJJJJFJJAJJJJJJ-F-AJJJJJJ-F-FJJFJJFJFFFFF<-F<FJJJF-<7<JF<-7AAFFJ--A<A77--7FAAF-A----7FF-7-7<FJ<A -7--<F7---77<----7-<<FA---7<<---7--- @ST-E00204:114:HHKTJALXX:4:1103:7141:2012 2:N:0:1 NAAAACATAAAATATAACAAACAAACTAAAAATCATAAAAAATAAAAAAACATCCACTTAACAACTTAAAAAATAACAAATCACTAATTATAATAAAAAATAAAAAATACACACTCTAACACCTAAAACACAACCAAAAAAACTAAAACTCC + !AAFFFFJJJJA-F--AFFJJ-F<JJF<AJFJ<JF-7<JJAA7-J-FFFJ7JJJFJ-F<AJJJJFFJ-AF-AJ<FF-JFFF-77<JJ---777<7----7 -A<JA-7<<FFF<--7--7-FFFF-<---7---7A-<A7FA------7- @ST-E00204:114:HHKTJALXX:4:1104:7101:2012 2:N:0:1 NATTTAAAAATACCCACTATAAAACATAAAATATAACAAAAAAACTAAAAATCATAAAAAATAAAAAAAATCCACTTCACGTCTTTTAACAATTTCGTCATTTTTAACATCCTCAAATAAATTATTCTCATTTTCCATAACTTCCAATTTT + !AA-FJJJJJJ-FJAJFJJJJJFJJAJJJJJJ-F-AJJJJJJ-F-FJJFJJFJFFFFF<-F<FJJJF-<7<JF<-7AAFFJ--A<A77--7FAAF-A----7FF-7-7<FJ<A -7--<F7---77<----7-<<FA---7<<---7---
期望的输出:
@ST-E00204:114:HHKTJALXX:4:1104:7101:2012 2:N:0:1 NATTTAAAAATACCCACTATAAAACATAAAATATAACAAAAAAACTAAAAATCATAAAAAATAAAAAAAATCCACTTCACGTCTTTTAACAATTTCGTCATTTTTAACATCCTCAAATAAATTATTCTCATTTTCCATAACTTCCAATTTT + !AA-FJJJJJJ-FJAJFJJJJJFJJAJJJJJJ-F-AJJJJJJ-F-FJJFJJFJFFFFF<-F<FJJJF-<7<JF<-7AAFFJ--A<A77--7FAAF-A----7FF-7-7<FJ<A -7--<F7---77<----7-<<FA---7<<---7---
一个想法是使用:
split -l 4 myfile.fq
然后根据第五个位置的数字删除每个文件,例如:
grep -v ":1104"
grep -v ":1105"
等等,但问题是文件很大。此外,我还必须删除较大的间隔,例如从 1000 到 2000,每个数字对应于大量读取。
答案1
awk解决方案:
awk -F':' -v RS="@" 'NR>1 && ($5<1101 || $5>1103){ print RS$0 }' myfile.fq
输出:
@ST-E00204:114:HHKTJALXX:4:1104:7101:2012 2:N:0:1
NATTTAAAAATACCCACTATAAAACATAAAATATAACAAAAAAACTAAAAATCATAAAAAATAAAAAAAATCCACTTCACGTCTTTTAACAATTTCGTCATTTTTAACATCCTCAAATAAATTATTCTCATTTTCCATAACTTCCAATTTT
+
!A-A-FJJJJJJ-FJAJFJJJJJFJJAJJJJJJ-F-AJJJJJJ-F-FJJFJJFJFFFFF<-F
细节:
-F':'
- 字段分隔符:
-v RS="@"
- 考虑@
作为记录分隔符($5<1101 || $5>1103)
- 检查所需字段是否符合条件“删除 1101 到 1103 之间”
答案2
这是一个 awk 解决方案,假设每个块正好有 4 行长。
awk -F ':' '
NR % 4 == 1 { keep = ($5 < 1101 || $5 > 1103) }
keep
'
说明:
-F :
将字段分隔符设置为:
。$5
是当前行的第五个字段(从 1 开始编号)。NR % 4 == 1 { … }
NR % 4 == 1
如果条件为 true,即当前行号是 4 加 1 的倍数,则执行大括号中的代码。keep = (…)
将变量设置keep
为指定条件。- 行只是
keep
说如果变量为真则打印当前行keep
。由于keep
仅每 4 行设置一次,因此它同样适用于 4 行块内的所有行。
答案3
sed -e '
/@/s/:/\n/4; /@/s/:/\n/4
/\n110[1-3]\n/,/^$/d
y/\n/:/
' fastq.data
- 在以 开头的行上标记序列号
@
。 - 删除包含序列号 1101 或 1102 或 1103 的块。
- 在所有其他块上,去掉标记并将其发送到标准输出。
结果
@ST-E00204:114:HHKTJALXX:4:1104:7101:2012 2:N:0:1
NATTTAAAAATACCCACTATAAAACATAAAATATAACAAAAAAACTAAAAATCATAAAAAATAAAAAAAATCCACTTCACGTCTTTTAACAATTTCGTCATTTTTAACATCCTCAAATAAATTATTCTCATTTTCCATAACTTCCAATTTT
+
!A-A-FJJJJJJ-FJAJFJJJJJFJJAJJJJJJ-F-AJJJJJJ-F-FJJFJJFJFFFFF<-F