2017-10-06 60 views
1

我使用的是正则表达式:与字符替换可变长度字符串匹配原始字符串长度

>\.*< 

匹配的字段3的某些部分,但我不能找出如何与多个字符替换会保留原始字符串的长度。

输入:

field1 field2 >>>>>.>............>>>.........<<<.......>>>>.......<<<<.<.<<<<<. 

预期输出:

field1 field2 >>>>>.>............>>LLLLLLLLLLL<<.......>>>LLLLLLLLL<<<.<.<<<<<. 

我可怜的失败尝试:

awk 'match($3, />\.*</){split($3, sst, "");for(i=RSTART;i<=RLENGTH;i++){sst[i]="L"};joined=sep="";for(x=1; x in sst;x++){joined=joined sep sst[x];sep=""};printf("%s\n", joined)}' hg19-matRNA.tsv > test2.tsv 

任何帮助将不胜感激!

+1

用Perl,它是非常清晰的,像'的perl -pe的/>(\.*) L “x长($ 1)”。“。 “<”/ eg'' –

+0

如果你没有将所有的代码都塞进一行,你会让自己变得更容易(并且我们试图帮助你)。 –

回答

1

随着GNU AWK的第三ARG匹配()和gensub():

$ cat tst.awk 
{ 
    while (match($3,/(.*)(>\.*<)(.*)/,a)) { 
     $3 = a[1] gensub(/./,"L","g",a[2]) a[3] 
    } 
    print 
} 

$ awk -f tst.awk file 
field1 field2 >>>>>.>............>>LLLLLLLLLLL<<.......>>>LLLLLLLLL<<<.<.<<<<<. 

对于任何AWK:

$ cat tst.awk 
{ 
    while (match($3,/>\.*</)) { 
     tgt = substr($3,RSTART,RLENGTH) 
     gsub(/./,"L",tgt) 
     $3 = substr($3,1,RSTART-1) tgt substr($3,RSTART+RLENGTH) 
    } 
    print 
} 

$ awk -f tst.awk file 
field1 field2 >>>>>.>............>>LLLLLLLLLLL<<.......>>>LLLLLLLLL<<<.<.<<<<<. 
0

AWK溶液。你可以使用patsplit以及这样的:

$ cat tst.awk 
{ 
    patsplit($3, a, ">\\.+<", seps) 
    l=(length(a)>length(seps)?length(a):length(seps)) 
    for (i=0; i<l; i++){ 
    if (i in a) gsub(/./,"L",a[i]) 
    s=s sprintf("%s", (i in a)?a[i]seps[i]:seps[i]) 
    } 
    $3=s 
}1 

$ awk -f tst.awk file 
field1 field2 >>>>>.>............>>LLLLLLLLLLL<<.......>>>LLLLLLLLL<<<.<.<<<<<.