根据序号删除大块的行

根据序号删除大块的行

我正在处理来自下一代测序数据的 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

  1. 在以 开头的行上标记序列号@
  2. 删除包含序列号 1101 或 1102 或 1103 的块。
  3. 在所有其他块上,去掉标记并将其发送到标准输出。

结果

@ST-E00204:114:HHKTJALXX:4:1104:7101:2012 2:N:0:1
NATTTAAAAATACCCACTATAAAACATAAAATATAACAAAAAAACTAAAAATCATAAAAAATAAAAAAAATCCACTTCACGTCTTTTAACAATTTCGTCATTTTTAACATCCTCAAATAAATTATTCTCATTTTCCATAACTTCCAATTTT
+
!A-A-FJJJJJJ-FJAJFJJJJJFJJAJJJJJJ-F-AJJJJJJ-F-FJJFJJFJFFFFF<-F

相关内容