使用awk获取每个字符前后的3个字符串

时间:2016-06-19 07:31:58

标签: bash shell awk

我所期望的是如下输出:

  

[在字符h之前为null并使用'#“赋值。在字符h之后   是“e”,“l”,“l”。]

     

[在字符e之前是“h”。字符e之后   “L”, “L”, “O”。]

     

[在字符l之前是“h”和“e”。字符后l   是“l”和“o”。]

     

[在字符l之前是“h”和“e”。性格后   l是“l”和“o”。]

     

[在字符l之前是“h”,“e”,“l”。后   字符l是“o”。]

     

[在字符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 #   #   #

如何解决?请指导我。感谢

1 个答案:

答案 0 :(得分:1)

gsub(/ /,"")添加到@fedorqui's answer to your previous question的顶部,将##更改为###并将5更改为7,然后您获得:

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