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

时间:2015-10-12 00:54:01

标签: linux bash awk sed grep

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

感谢。

2 个答案:

答案 0 :(得分:1)

对于内存问题和使用不正常的管道

grep -v -f ListToExclude.file file.fastq \
 | sed -u -e '/^@/!d' -e 'N;N;N'
  • grep从列表中删除条目行以删除
  • 不以@开头的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