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
重建它。