2016-06-19 5 views
0

を使用して、各文字の前と後の3文字列を取得すると、以下のように出力されます:は、私が期待している何のawk

[文字hがnullである前に「#に割り当てるe 『の文字H がされた後。』 」、 "L"、 "L"]

[文字Eは、前に "H"。キャラクタE後 あり、 "L"、 "L"、 "O"]

[文字L前文字「」が「l」および「o」の後に「h」および「e」である。

[文字lの前には "h"と "e"があります。文字 の後は、 "l"と "o"です。]

[文字lの前は "h"、 "e"、 "l"です。 の文字lが "o"の場合]

[文字の前は "e"、 "l"、 "l"です。 文字oはnullで、「#」を割り当てた後]

# # # 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

は、@fedorqui's answer to your previous questionのトップにgsub(/ /,"")を追加#####に変更し、7から5を変更し、あなたが得る:

$ 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

ありがとう@エド・モートン。 – Paranrax

+1

あなたは大歓迎です。前回の質問に対する答えが本当に選ばれているはずです。これははっきりと明瞭で簡単でした。あなたが今発見したように、要件が変わったときにそれを微調整する必要がある場合、非常に重要です。私がしたようにあなたはそれを微調整でき、助けを求める必要はなかったと確信しています。 –

関連する問題