2016-06-19 63 views
0
每個字符後

我所預期的那樣,輸出象下面這樣:獲得3串之前並用awk

[前字符h爲空,以「#分配。‘字符^ h 後的’e 」, 「升」, 「升」。]

[前字符e爲 「H」。字符e爲 後的 「L」, 「L」, 「O」。]

[前字符升是「h」和「e」。字符l 是「l」和「o」。]

[在字符l之前是「h」和「e」。在字符 之後是「l」和「o」。]

[在字符l之前是「h」,「e」,「l」。 後的字符l是「o」。]

[在字符o之前是「e」,「l」,「l」。之後 字符o是空,並指定以「#」]

# # # h e l l 
# # h e l l o 
# h e l l o # 
h e l l o # # 
e l l o # # # 

# # # w o n d 
# # w o n d e 
# w o n d e r 
w o n d e r f 
o n d e r f u 
n d e r f u l 
d e r f u l # 
e r f u l # # 
r f u l # # # 

輸入文件:

h e l l o 

w o n d e r f u l 

代碼:

awk -v s1="# # #" 
'BEGIN{v=length(s1)} 
     {$0=s1 $0 s1;num=split($0, A,""); 
     for(i=v+1;i<=num-v;i++){ 
      q=i-v;p=i+v; 
     while(q<=p){ 
      Q=Q?Q OFS A[q]:A[q];q++ 
     }; 
     print Q;Q="" 
     } 
}' InputFile 

但我得到的結果是:

# # # h e l 
    # # h e l l 
# # h e l l 
    # h e l l o 
# h e l l o # 
h e l l o # 
    e l l o # # 
e l l o # # 
    l l o # # # 

# # # w o n 
    # # w o n d 
# # w o n d 
    # w o n d e 
# w o n d e 
w o n d e r 
    o n d e r 
o n d e r f 
    n d e r f 
n d e r f u 
    d e r f u 
d e r f u l 
    e r f u l # 
e r f u l # 
    r f u l # # 
r f u l # # 
    f u l # # # 

如何解決?請指導我。由於

+0

我確實略勝一籌通過OFS設置爲「」。 – Yaron

回答

1

添加gsub(/ /,"")@fedorqui's answer to your previous question頂部,改變#####和更改57,你會得到:

$ cat tst.awk 
{ 
    gsub(/ /,"") 
    n=length($0) 
    $0 = "###" $0 "###" 
    gsub(/./, "& ") 
    for (i=1; i<=2*n; i+=2) 
     print substr($0, i, 7*2-1) 
    print "" 
} 

$ awk -f tst.awk file 
# # # h e l l 
# # h e l l o 
# h e l l o # 
h e l l o # # 
e l l o # # # 


# # # w o n d 
# # w o n d e 
# w o n d e r 
w o n d e r f 
o n d e r f u 
n d e r f u l 
d e r f u l # 
e r f u l # # 
r f u l # # # 
+1

謝謝@Ed Morton。 – Paranrax

+1

不客氣。你真的應該選擇@ fedorqui對你以前的問題的答案,它是迄今爲止最清楚和最簡單的答案,正如你現在發現的那樣,當你的需求改變時你需要調整它時,它是非常重要的。我相信你可以像我一樣調整,而不必尋求幫助。 –