我有一个大文件(.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