我有一个大文件(.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这样做?
感谢。
答案 0 :(得分:1)
对于内存问题和使用不正常的管道
grep -v -f ListToExclude.file file.fastq \
| sed -u -e '/^@/!d' -e 'N;N;N'
@
开头的sed删除行。如果从@
开始,它还包括输出的下3行
-u
使用unbuffered选项,在这种情况下很有用答案 1 :(得分:0)
#!/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