我正在Linux集群上使用bash。我正在尝试从.fastq文件中提取读取,如果它们包含与查询序列匹配的内容。下面是一个包含三个读取的.fastq文件示例。
$ cat example.fastq
@SRR1111111.1 1/1
CTGGANAAGTGAAATAATATAAATTTTTCCACTATTGAATAAAAGCAACTTAAATTTTCTAAGTCG
+
AAAAA#EEEEEEEEEEEEEEEEEEEEEEEAEEEEEEEEEEEEEEEEEEEEEEEEEA<AAEEEEE<6
@SRR1111111.2 2/1
CTATANTATTCTATATTTATTCTAGATAAAAGCATTCTATATTTAGCATATGTCTAGCAAAAAAAA
+
AAAAA#EE6EEEEEEEEEEEEAAEEAEEEEEEEEEEEE/EAE/EAE/EA/EAEAAAE//EEAEAA6
@SRR1111111.3 3/1
CTATANTATTGAAATAATAATGTAGATAAAACTATTGAATAACAGCAACTTAAATTTTCAATAAGA
+
AAAAA#EE6EEEEEEEEEEEEAAEEAEEEEEEEEEEEE/EAE/EAE/EA/EAEAAAE//EEAEAA6
我想提取包含序列GAAATAATA的读段。我可以使用grep执行此提取,如以下命令所示。
$ grep -F -B 1 -A 2 "GAAATAATA" example.fastq > MATCH.fastq
$ cat MATCH.fastq
@SRR1111111.1 1/1
CTGGANAAGTGAAATAATATAAATTTTTCCACTATTGAATAAAAGCAACTTAAATTTTCTAAGTCG
+
AAAAA#EEEEEEEEEEEEEEEEEEEEEEEAEEEEEEEEEEEEEEEEEEEEEEEEEA<AAEEEEE<6
@SRR1111111.3 3/1
CTATANTATTGAAATAATAATGTAGATAAAACTATTGAATAACAGCAACTTAAATTTTCAATAAGA
+
AAAAA#EE6EEEEEEEEEEEEAAEEAEEEEEEEEEEEE/EAE/EAE/EA/EAEAAAE//EEAEAA6
但是,此策略不能容忍任何不匹配。例如,包含序列GAAAT G ATA的读取将被忽略。我需要这种提取来容忍查询序列中任何位置的一个不匹配。所以我的问题是如何实现这一目标?是否存在与grep具有类似功能的序列比对软件包?有没有可用的fastq子设置包可以执行这种类型的操作?需要注意的是速度非常重要。感谢您的指导。
答案 0 :(得分:1)
这是一个使用agrep
获取匹配记录数的解决方案,并且使用awk可以打印出具有某些上下文的记录(由于{{1中缺少-A
和-B
}}):
agrep
输出:
$ agrep -1 -n "GAAATGATA" file |
awk -F: 'NR==FNR{for(i=($1-1);i<=($1+2);i++)a[i];next}FNR in a' - file
答案 1 :(得分:1)
您可以尝试模式文件-
$: cat GAAATAATA
.AAATAATA
G.AATAATA
GA.ATAATA
GAA.TAATA
GAAA.AATA
GAAAT.ATA
GAAATA.TA
GAAATAA.A
GAAATAAT.
然后
grep -B 1 -A 2 -f GAAATAATA example.fastq > MATCH.fastq
但是添加完整的正则表达式解析和每个可能的单个更改的备用模式可能会稍微减慢该过程。
回应评论中的问题
对于给定值$word
,例如word=GAAATAATA
,
awk '{
for ( i=1; i<=length($0); i++ ) {
split($0,tmp,""); tmp[i]=".";
for ( n=1; n<=length($0); n++ ) { printf tmp[n]; }
printf "\n";
}
}' <<< "$word" > "$word"
这将创建此特定文件。 希望能有所帮助,但是请记住,这会慢很多,因为您现在正在使用正则表达式而不是仅匹配纯字符串, AND 您正在引入一系列其他匹配的模式... >
答案 2 :(得分:0)
如果您的问题中的MATCH.fastq
是否为预期的输出,或者即使您的示例输入包含任何需要有效解决方案才能找到idk的情况(如果它确实在工作),则应该运行idk: / p>
$ cat tst.awk
BEGIN {
for (i=1; i<=length(seq); i++) {
regexp = regexp sep substr(seq,1,i-1) "." substr(seq,i+1)
sep = "|"
}
}
{ rec = rec $0 ORS }
!(NR % 4) {
if (rec ~ regexp) {
printf "%s", rec
}
rec = ""
}
$ awk -v seq='GAAATAATA' -f tst.awk example.fastq
@SRR1111111.1 1/1
CTGGANAAGTGAAATAATATAAATTTTTCCACTATTGAATAAAAGCAACTTAAATTTTCTAAGTCG
+
AAAAA#EEEEEEEEEEEEEEEEEEEEEEEAEEEEEEEEEEEEEEEEEEEEEEEEEA<AAEEEEE<6
@SRR1111111.3 3/1
CTATANTATTGAAATAATAATGTAGATAAAACTATTGAATAACAGCAACTTAAATTTTCAATAAGA
+
AAAAA#EE6EEEEEEEEEEEEAAEEAEEEEEEEEEEEE/EAE/EAE/EA/EAEAAAE//EEAEAA6