我对unix很陌生!
试图弄清楚,从 fastq 文件中,有多少次读取连续有 3 个或更多 As ?
我使用egrep 'A{3}' 来告诉我有多少个AAA。但现在我想连续知道 >= 3 AAA。但是 >= 不起作用。我可以使用 awk 来帮助我确定这一点吗?
另外,我如何使用正则表达式来确定有多少个读取有 4 个或更多的 A 后跟 T 以外的东西? (GC 或 A)因此 A 必须 >= 4,然后是 GCorA
编辑:当我连续说 3A 时,我的意思是这样的:GGCTAAAAAACGGAT
答案1
如果你有三个或更多a
,你可以使用:a{3,}
。例如:
$ echo a | grep -E 'a{3,}'
$ echo aa | grep -E 'a{3,}'
$ echo aaa | grep -E 'a{3,}'
aaa
$ echo aaaa | grep -E 'a{3,}'
aaaa
$ echo aaaaaaaaaa | grep -E 'a{3,}'
aaaaaaaaaa
如果您想要 3 个或更多a
s 后跟不是 a 的内容t
,则可以使用a{3,}[^t]
.例如:
$ echo aaa | grep -E 'a{3,}[^t]'
$ echo aaat | grep -E 'a{3,}[^t]'
$ echo aaax | grep -E 'a{3,}[^t]'
aaax
但请注意, ana
不是 a t
,因此它将匹配类似 'aaaa' 的内容;前三个a
s 后跟一个不是 a 的字符t
(在本例中为a
)。
$ echo aaaa | grep -E 'a{3,}[^t]'
aaaa
如果您希望字符串以既不是a
也不是的内容结尾t
,您可以使用:a{3,}[^at]
。例如:
$ echo aaaa | grep -E 'a{3,}[^ta]'
$ echo aaaaaaaa | grep -E 'a{3,}[^ta]'
$ echo aaaaaaaattt | grep -E 'a{3,}[^ta]'
$ echo aaaaaaaab | grep -E 'a{3,}[^ta]'
aaaaaaaab
答案2
要打印三个或更多 s 的序列计数A
,请尝试
awk '{print gsub (/AAAA*/, "&")}' file
3
4
4
1
对于您的第二个请求,请修改上面的内容,例如
awk '{print gsub (/AAAAA*[CG]/, "&")}' file
“后跟 A”已被 A* 模式覆盖。
答案3
从 fastq 文件中,有多少次读取连续有 3 个或更多 As
由于它是 fastq 格式文件,因此您只想查看实际的序列行,而不是所有行,以获得准确的计数。您可以通过使用NR
变量将匹配限制为每个 4 行序列块的第二行来实现此目的:
awk 'NR%4 == 2 && /AAA/ { count++ } END { print count+0 }' foo.fastq
有多少次读取运行了 4 个或更多 A,后跟 T 以外的其他内容? (GC 或 A)
awk 'NR%4 == 2 && /AAAA([^T]|$)/ { count++ } END { print count+0 }' foo.fastq
(请注意,这将匹配,AAAAAT
因为它有 4 个 A,后跟另一个 A)