根据两个单独文件之间的匹配项删除多行



我有一个大文件(.fastq 1.6Gb(,其中每个条目都是四行,其中新条目从以@开头的行开始:

@SRR392137.1 I331_3_FC302WFAAXX:3:1:225:1941 length=35
GATGGTAGAAACATACGTCTT
+SRR392137.1 I331_3_FC302WFAAXX:3:1:225:1941 length=35
IIIIIIIIIIIIIIIIIIIII
@SRR392137.2 I331_3_FC302WFAAXX:3:1:163:1931 length=35
GAATCATTTTGATAATAATAAGTTC
+SRR392137.2 I331_3_FC302WFAAXX:3:1:163:1931 length=35
IIIIIIIIIIIIIIIIIIIIIIIII
@SRR392137.4 I331_3_FC302WFAAXX:3:1:164:1938 length=35
GACGGGTGAGTAACGCGTAAGAAC
+SRR392137.4 I331_3_FC302WFAAXX:3:1:164:1938 length=35
IIIIIIIIIIIIIIIIIIIIIIII
@SRR392137.5 I331_3_FC302WFAAXX:3:1:233:1936 length=35
GATGGTTTTGTCTGCTTAGATC
+SRR392137.5 I331_3_FC302WFAAXX:3:1:233:1936 length=35
IIIIIIIIIIIIIIIIIIIIII

我有第二个文件,其中包含需要从 .fastq 文件中删除的 ID(总共 500,000 个(:

@SRR392137.2
@SRR392137.4

这将包括删除包含字符串的行和下面的接下来的 3 行,以便输出文件包含:

@SRR392137.1 I331_3_FC302WFAAXX:3:1:225:1941 length=35
GATGGTAGAAACATACGTCTT
+SRR392137.1 I331_3_FC302WFAAXX:3:1:225:1941 length=35
IIIIIIIIIIIIIIIIIIIII
@SRR392137.5 I331_3_FC302WFAAXX:3:1:233:1936 length=35
GATGGTTTTGTCTGCTTAGATC
+SRR392137.5 I331_3_FC302WFAAXX:3:1:233:1936 length=35
IIIIIIIIIIIIIIIIIIIIII

有没有办法使用 grep、sed 或 awk 来做到这一点?

谢谢。

对于内存问题和使用不希望的管道

grep -v -f ListToExclude.file file.fastq 
 | sed -u -e '/^@/!d' -e 'N;N;N'
  • grep 从列表中删除要删除的条目
  • 不以 @ 开头的 sed 删除行。如果以 @ 开头,则还包括接下来要输出的 3 行
    • -u使用无缓冲选项,在这种情况下很有用
#!/usr/bin/awk -f
BEGIN {
  RS = "@"
}
NR == FNR {
  z[$1]
  next
}
$1 in z {
  next
}
{
  printf RS $0
}

像这样运行:

alpha.awk list.ids large.fastq

awk 'NR==FNR {z[$1];next} $1 in z {next} {printf RS$0}' RS=@ list.ids large.fastq

最新更新