使用 grep with patternfile returns 不在 patternfile 中的模式(序列名称)
Using grep with patternfile returns patterns (sequence names) not in patternfile
我正在清理测序数据。
我有一个带有读取(名称)的文件,我想用 grep
找到并最终删除。
patternfile 文件有 219,721 行长,没有重复的条目。序列 .fastq
文件长 557,514,608 行,没有重复的名称。
我用过:
grep -f patternfile.txt sequencefile.fastq > outputfile.txt
我希望输出文件与模式文件相同(除了末尾包含 1:N:0:ACTGAT
),但输出文件有 135 个完整的额外行(名称)。这些额外的名称不是重复的,并且在模式文件中找不到。我可以打开输出文件并识别额外的行。下面显示了模式文件第 340-342 行的示例:
@NB501827:133:HMV5HAFX2:1:11101:13856:12920
@NB501827:133:HMV5HAFX2:1:11101:16016:12934
@NB501827:133:HMV5HAFX2:1:11101:19446:12943
输出文件与第 341 行相同,如下所示:
@NB501827:133:HMV5HAFX2:1:11101:13856:12920 1:N:0:ACTGAT
@NB501827:133:HMV5HAFX2:1:11101:26336:12921 1:N:0:ACTGAT
@NB501827:133:HMV5HAFX2:1:11101:16016:12934 1:N:0:ACTGAT
@NB501827:133:HMV5HAFX2:1:11101:19446:12943 1:N:0:ACTGAT
请注意,第 341 行 @NB501827:133:HMV5HAFX2:1:11101:26336:12921 1:N:0:ACTGAT
处存在错误的额外行,这只是其他 134 行额外行的一个示例。
我为什么要这样做?
这是一个配对末端读取测序实验,我发现了 219,721 个实例,其中“sequencefileR2”文件中的读取是一串 75“G”,并且由于测序而出现明显错误。我能够使用 grep 提取这些序列名称,现在想删除两个文件(sequencefileR1 和 sequencefileR2)中的相应读取。计划是使用 grep
的反标志(例如 grep -v
)来生成没有这些特定序列的序列文件。我在生成最终文件之前检查了 grep 输出并发现了这个问题。
我尝试了什么?
我已尝试确保不存在 Windows (DOS) 行尾。
我试过在模式文件中包含 1:N:0:ACTGAT
我已经在三个不同的文件系统(CentOS7、Gitbash、Cygwin)上尝试过这个命令,结果相同(总是得到 exactly 相同的输出)。
我试过了 egrep
我使用了上面显示的模式文件的第 340、341 和 342 行(以及 和 错误的输出行),并且只从序列文件中得到一个输出行(例如)
grep @NB501827:133:HMV5HAFX2:1:11101:13856:12920 sequencefileR2.fastq
@NB501827:133:HMV5HAFX2:1:11101:13856:12920 1:N:0:ACTGAT
我尝试从模式文件的每一行中删除 @
符号,但得到了 相同的 结果。
我试过将 grep 放在一个循环中(没有用,他们是业余尝试)
for pattern in 'R1-R2-names.txt'; do grep "$pattern"
L_lactis_S1_LALL_R2_001.fastq >> loopr1names; done
for pattern in 'cat R1-R2-names.txt'; do grep "$pattern"
L_lactis_S1_LALL_R2_001.fastq >> loopr1names; done
我对 sed
和 awk
解决方案持开放态度,但想了解为什么这个简单的 bash 解决方案不起作用。谢谢。
使用
grep -w -F -f patternfile.txt sequencefile.fastq > outputfile.txt
-w
表示只有当模式被单词边界包围时才匹配模式。 -F
表示匹配固定文本模式,而不是正则表达式(这在这里可能并不重要,因为您的模式似乎不包含任何具有特殊含义的字符,但这是一个很好的做法)。
我怀疑您的模式文件包含 @NB501827:133:HMV5HAFX2:1:11101:26336:12921
的前缀,所以它匹配这一行。 -w
选项将阻止匹配这些前缀。
我正在清理测序数据。
我有一个带有读取(名称)的文件,我想用 grep
找到并最终删除。
patternfile 文件有 219,721 行长,没有重复的条目。序列 .fastq
文件长 557,514,608 行,没有重复的名称。
我用过:
grep -f patternfile.txt sequencefile.fastq > outputfile.txt
我希望输出文件与模式文件相同(除了末尾包含 1:N:0:ACTGAT
),但输出文件有 135 个完整的额外行(名称)。这些额外的名称不是重复的,并且在模式文件中找不到。我可以打开输出文件并识别额外的行。下面显示了模式文件第 340-342 行的示例:
@NB501827:133:HMV5HAFX2:1:11101:13856:12920
@NB501827:133:HMV5HAFX2:1:11101:16016:12934
@NB501827:133:HMV5HAFX2:1:11101:19446:12943
输出文件与第 341 行相同,如下所示:
@NB501827:133:HMV5HAFX2:1:11101:13856:12920 1:N:0:ACTGAT
@NB501827:133:HMV5HAFX2:1:11101:26336:12921 1:N:0:ACTGAT
@NB501827:133:HMV5HAFX2:1:11101:16016:12934 1:N:0:ACTGAT
@NB501827:133:HMV5HAFX2:1:11101:19446:12943 1:N:0:ACTGAT
请注意,第 341 行 @NB501827:133:HMV5HAFX2:1:11101:26336:12921 1:N:0:ACTGAT
处存在错误的额外行,这只是其他 134 行额外行的一个示例。
我为什么要这样做?
这是一个配对末端读取测序实验,我发现了 219,721 个实例,其中“sequencefileR2”文件中的读取是一串 75“G”,并且由于测序而出现明显错误。我能够使用 grep 提取这些序列名称,现在想删除两个文件(sequencefileR1 和 sequencefileR2)中的相应读取。计划是使用 grep
的反标志(例如 grep -v
)来生成没有这些特定序列的序列文件。我在生成最终文件之前检查了 grep 输出并发现了这个问题。
我尝试了什么?
我已尝试确保不存在 Windows (DOS) 行尾。
我试过在模式文件中包含 1:N:0:ACTGAT
我已经在三个不同的文件系统(CentOS7、Gitbash、Cygwin)上尝试过这个命令,结果相同(总是得到 exactly 相同的输出)。
我试过了 egrep
我使用了上面显示的模式文件的第 340、341 和 342 行(以及 和 错误的输出行),并且只从序列文件中得到一个输出行(例如)
grep @NB501827:133:HMV5HAFX2:1:11101:13856:12920 sequencefileR2.fastq
@NB501827:133:HMV5HAFX2:1:11101:13856:12920 1:N:0:ACTGAT
我尝试从模式文件的每一行中删除 @
符号,但得到了 相同的 结果。
我试过将 grep 放在一个循环中(没有用,他们是业余尝试)
for pattern in 'R1-R2-names.txt'; do grep "$pattern"
L_lactis_S1_LALL_R2_001.fastq >> loopr1names; done
for pattern in 'cat R1-R2-names.txt'; do grep "$pattern"
L_lactis_S1_LALL_R2_001.fastq >> loopr1names; done
我对 sed
和 awk
解决方案持开放态度,但想了解为什么这个简单的 bash 解决方案不起作用。谢谢。
使用
grep -w -F -f patternfile.txt sequencefile.fastq > outputfile.txt
-w
表示只有当模式被单词边界包围时才匹配模式。 -F
表示匹配固定文本模式,而不是正则表达式(这在这里可能并不重要,因为您的模式似乎不包含任何具有特殊含义的字符,但这是一个很好的做法)。
我怀疑您的模式文件包含 @NB501827:133:HMV5HAFX2:1:11101:26336:12921
的前缀,所以它匹配这一行。 -w
选项将阻止匹配这些前缀。