awk 和egrep 用于正则表达式

awk 和egrep 用于正则表达式

我对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 个或更多as 后跟不是 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' 的内容;前三个as 后跟一个不是 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)

相关内容