Awk 将-的所有实例替换为。直到A或G或T或C从字符串的两端开始

Awk 将-的所有实例替换为。直到A或G或T或C从字符串的两端开始,awk,Awk,例如,如果输入是:--A--GG--CCAAT--A--输出应该是:..A--GG--CCAAT--A….我更愿意在awk中这样做。这将有点复杂,因为awk不允许您使用匹配的字符串调用函数,因此,您需要手动取出匹配的字符串(l和r),进一步处理它们,并用原始字符串加上匹配的字符串替换$0: awk '{ if (match($0, /^-*/)) { l = substr($0, 1, RLENGTH); gsub("-", ".", l); $0 = l substr($0, RLEN

例如,如果输入是:

--A--GG--CCAAT--A--


输出应该是:

..A--GG--CCAAT--A….


我更愿意在awk中这样做。

这将有点复杂,因为
awk
不允许您使用匹配的字符串调用函数,因此,您需要手动取出匹配的字符串(
l
r
),进一步处理它们,并用原始字符串加上匹配的字符串替换
$0

awk '{
    if (match($0, /^-*/)) { l = substr($0, 1, RLENGTH); gsub("-", ".", l); $0 = l substr($0, RLENGTH + 1); }
    if (match($0, /-*$/)) { r = substr($0, RSTART); gsub("-", ".", r); $0 = substr($0, 1, RSTART - 1) r; }
    print $0;
}'
或者再次使用
gsub
$0
中的匹配字符串进行变异,而不是串联:

awk '{
    if (match($0, /^-*/)) { l = substr($0, 1, RLENGTH); gsub("-", ".", l); gsub(/^-*/, l, $0); }
    if (match($0, /-*$/)) { r = substr($0, RSTART); gsub("-", ".", r); gsub(/-*$/, r, $0); }
    print $0;
}'

你已经试过什么了吗?你有什么例子我们可以从中开始吗?您至少应该表明您已经进行了一些搜索,否则让其他人为您编写代码就太容易了:-)我试图在gsub的各种组合中使用^和$以及通配符,但它没有导致任何结果,基本上是从:awk'{gsub(/-/,“);print}构建的。如果有人教我如何从一端开始,我就可以做到,然后再重新开始,那就好了。非常感谢。诀窍是使用我不知道存在的内置变量。事实上,我只是在
awk
manpage中学习了这些变量。我正在查看
match()
,但是它没有返回匹配的字符串。因此,我尝试使用
RSTART
RLENGTH
重建它。