2017-10-06 84 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<<<.<.<<<<<.