如何在 awk 或 sed 中使用正则表达式来查找 DNA 序列中的所有同聚物?
how to use regular expression in awk or sed, for find all homopolymers in DNA sequence?
背景
均聚物是具有连续相同碱基的 DNA 子序列,如 AAAAAAA
。 python 中的示例用于提取它:
import re
DNA = "ACCCGGGTTTAACCGGACCCAA"
homopolymers = re.findall('A+|T+|C+|G+', DNA)
print homopolymers
['A', 'CCC', 'GGG', 'TTT', 'AA', 'CC', 'GG', 'A', 'CCC', 'AA']
我的努力
我制作了一个解决问题的 gawk 脚本,但没有使用正则表达式:
echo "ACCCGGGTTTAACCGGACCCAA" | gawk '
BEGIN{
FS=""
}
{
homopolymer = ;
base = ;
for(i=2; i<=NF; i++){
if($i == base){
homopolymer = homopolymer""base;
}else{
print homopolymer;
homopolymer = $i;
base = $i;
}
}
print homopolymer;
}'
输出
A
CCC
GGG
TTT
AA
CC
GG
A
CCC
AA
问题
如何在 awk 或 sed 中使用正则表达式,得到相同的结果?
grep -o
将在一行中为您提供:
echo "ACCCGGGTTTAACCGGACCCAA"| grep -ioE '([A-Z])*'
A
CCC
GGG
TTT
AA
CC
GG
A
CCC
AA
解释:
([A-Z]) # matches and captures a letter in matched group #1
* # matches 0 or more of captured group #1 using back-reference
sed
不是最好的工具,但由于 OP 要求它:
echo "ACCCGGGTTTAACCGGACCCAA" | sed -r 's/([A-Z])*/&\n/g'
A
CCC
GGG
TTT
AA
CC
GG
A
CCC
AA
PS: 这是 gnu-sed。
尝试使用拆分并进行比较。
echo "ACCCGGGTTTAACCGGACCCAA" | awk '{ split([=10=], chars, "")
for (i=1; i <= length([=10=]); i++) {
if (chars[i]!=chars[i+1])
{
printf("%s\n", chars[i])
}
else
{
printf("%s", chars[i])
}
}
}'
A
CCC
GGG
TTT
AA
CC
GG
A
CCC
AA
解释
split方法将你发送给awk的一行字符串进行分割,并将数组chars[]中的每个字符分开。现在,我们遍历整个数组并检查 char 是否等于下一个 if (chars[i]!=chars[i+1])
然后,如果相等,我们只打印 char,并等待下一个。如果下一个不同,我们只打印基本字符,\n
表示换行符。
背景
均聚物是具有连续相同碱基的 DNA 子序列,如 AAAAAAA
。 python 中的示例用于提取它:
import re
DNA = "ACCCGGGTTTAACCGGACCCAA"
homopolymers = re.findall('A+|T+|C+|G+', DNA)
print homopolymers
['A', 'CCC', 'GGG', 'TTT', 'AA', 'CC', 'GG', 'A', 'CCC', 'AA']
我的努力
我制作了一个解决问题的 gawk 脚本,但没有使用正则表达式:
echo "ACCCGGGTTTAACCGGACCCAA" | gawk '
BEGIN{
FS=""
}
{
homopolymer = ;
base = ;
for(i=2; i<=NF; i++){
if($i == base){
homopolymer = homopolymer""base;
}else{
print homopolymer;
homopolymer = $i;
base = $i;
}
}
print homopolymer;
}'
输出
A CCC GGG TTT AA CC GG A CCC AA
问题
如何在 awk 或 sed 中使用正则表达式,得到相同的结果?
grep -o
将在一行中为您提供:
echo "ACCCGGGTTTAACCGGACCCAA"| grep -ioE '([A-Z])*'
A
CCC
GGG
TTT
AA
CC
GG
A
CCC
AA
解释:
([A-Z]) # matches and captures a letter in matched group #1
* # matches 0 or more of captured group #1 using back-reference
sed
不是最好的工具,但由于 OP 要求它:
echo "ACCCGGGTTTAACCGGACCCAA" | sed -r 's/([A-Z])*/&\n/g'
A
CCC
GGG
TTT
AA
CC
GG
A
CCC
AA
PS: 这是 gnu-sed。
尝试使用拆分并进行比较。
echo "ACCCGGGTTTAACCGGACCCAA" | awk '{ split([=10=], chars, "")
for (i=1; i <= length([=10=]); i++) {
if (chars[i]!=chars[i+1])
{
printf("%s\n", chars[i])
}
else
{
printf("%s", chars[i])
}
}
}'
A
CCC
GGG
TTT
AA
CC
GG
A
CCC
AA
解释
split方法将你发送给awk的一行字符串进行分割,并将数组chars[]中的每个字符分开。现在,我们遍历整个数组并检查 char 是否等于下一个 if (chars[i]!=chars[i+1])
然后,如果相等,我们只打印 char,并等待下一个。如果下一个不同,我们只打印基本字符,\n
表示换行符。