Regex 如何使用awk重复一段线?

Regex 如何使用awk重复一段线?,regex,bash,awk,grep,copybook,Regex,Bash,Awk,Grep,Copybook,我试图重复这一行,以避免出现单词在该行中初始化的次数。要重复的行块在行首的数字较小 我的意思是,有了这个输入: 01 PATIENT-TREATMENTS. 05 PATIENT-NAME PIC X(30). 05 PATIENT-SS-NUMBER PIC 9(9). 05 NUMBER-OF-TREATMENTS PIC 99 COMP-3. 05 TREATMENT-HISTORY OCCU

我试图重复这一行,以避免
出现
单词在该行中初始化的次数。要重复的行块在行首的数字较小

我的意思是,有了这个输入:

01  PATIENT-TREATMENTS.
   05  PATIENT-NAME                PIC X(30).
   05  PATIENT-SS-NUMBER           PIC 9(9).
   05  NUMBER-OF-TREATMENTS        PIC 99 COMP-3.
   05  TREATMENT-HISTORY OCCURS 2.
       10  TREATMENT-DATE OCCURS 3.
           15  TREATMENT-DAY        PIC 99.
           15  TREATMENT-MONTH      PIC 99.
           15  TREATMENT-YEAR       PIC 9(4).
       10  TREATING-PHYSICIAN       PIC X(30).
       10  TREATMENT-CODE           PIC 99.
   05 HELLO PIC X(9).
   05 STACK OCCURS 2.
       10 OVERFLOW PIC X(99).
这将是输出:

01  PATIENT-TREATMENTS.
   05  PATIENT-NAME                PIC X(30).
   05  PATIENT-SS-NUMBER           PIC 9(9).
   05  NUMBER-OF-TREATMENTS        PIC 99 COMP-3.
   05  TREATMENT-HISTORY OCCURS 2.
       10  TREATMENT-DATE OCCURS 3.
           15  TREATMENT-DAY        PIC 99.
           15  TREATMENT-MONTH      PIC 99.
           15  TREATMENT-YEAR       PIC 9(4).
           15  TREATMENT-DAY        PIC 99.
           15  TREATMENT-MONTH      PIC 99.
           15  TREATMENT-YEAR       PIC 9(4).
           15  TREATMENT-DAY        PIC 99.
           15  TREATMENT-MONTH      PIC 99.
           15  TREATMENT-YEAR       PIC 9(4).
       10  TREATING-PHYSICIAN       PIC X(30).
       10  TREATMENT-CODE           PIC 99.
           15  TREATMENT-DAY        PIC 99.
           15  TREATMENT-MONTH      PIC 99.
           15  TREATMENT-YEAR       PIC 9(4).
           15  TREATMENT-DAY        PIC 99.
           15  TREATMENT-MONTH      PIC 99.
           15  TREATMENT-YEAR       PIC 9(4).
           15  TREATMENT-DAY        PIC 99.
           15  TREATMENT-MONTH      PIC 99.
           15  TREATMENT-YEAR       PIC 9(4).
       10  TREATING-PHYSICIAN       PIC X(30).
       10  TREATMENT-CODE           PIC 99.
   05 HELLO PIC X(9).
   05 STACK OCCURS 2.
       10 OVERFLOW PIC X(99).
       10 OVERFLOW PIC X(99).
我这样试过:

tac input.txt |
awk '
BEGIN {
 lbuff="";
 n=0;
}{

  if($0 ~ /^\s*$/) {next;}

  if ($3 == "OCCURS") {
    lev_oc=$1
    len_oc=$4
    lstart=0

    for (x=1; x<n; x++) {
      split(saved[x],saved_level," ")
      if (saved_level[1] <= lev_oc) {
        print saved[x]
        lstart=x+1
      }
    }

    for (i=1; i<=len_oc; i++) {
      for (x=lstart; x<n; x++) {
        print saved[x]
      }
    }

    print $0

  }else if ($0) {
    saved[n]=$0
    n++
  }

}' | tac
tac input.txt|
awk'
开始{
lbuff=“”;
n=0;
}{
如果($0~/^\s*$/){next;}
如果($3==“发生”){
lev_oc=$1
len_oc=4美元
lstart=0

对于(x=1;x我使用了perl,因为它很容易生成任意复杂的数据结构:

!/usr/bin/perl
严格使用;
使用警告;
#将文件读入一行数组。

打开我的$f,“这里有一个ruby解决方案:

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
stack = []
def unwind_frame(stack)
    frame = stack.pop
    _,occurs,data = *frame
    with_each = stack==[] ? ->(l){ puts l} : ->(l){stack.last[2].push l}
    occurs.times { data.each &with_each }
end
while gets
  $_.chomp! "\n"
  if m=$_.match(/OCCURS ([0-9]*)\.\s*$/)
    puts $_
    occurs=m[1].to_i
    level = $_.to_i
    stack.push([level,occurs,[]])
    next
  end
  if stack==[]; puts $_; next; end
  level = $_.to_i
  if level > stack.last[0]
    stack.last[2].push $_
    next
  end
  while(stack!=[] && level <= stack.last[0])
    unwind_frame(stack)
    stack!=[] ? stack.last[2].push($_) : puts($_)
  end
end
while(stack!=[])
  unwind_frame(stack)
end
!/usr/bin/env ruby
#-*-编码:utf-8-*-
堆栈=[]
def放卷机架(堆栈)
frame=stack.pop
_,发生,数据=*帧
with_each=stack=[]?->(l){put l}:->(l){stack.last[2]。push l}
accurs.times{data.each&带有_each}
结束
当得到
$\u.chomp!“\n”
如果m=$\匹配(/发生([0-9]*)\。\s*$/)
放置$_
发生率=m[1]。到_i
级别=$\到\u i
stack.push([级别,发生,[]))
下一个
结束
如果堆栈=[];放入$u;下一个;结束
级别=$\到\u i
如果级别>堆栈上次[0]
stack.last[2]。推送$_
下一个
结束

while(stack!=[]&&level Awesome!谢谢!我更喜欢awk版本,但还可以。请解释一下代码,我不熟悉perl Syntax。我已经更新了我的awk版本。您能告诉我您的意见吗?谢谢!:)谢谢!但awk版本返回:
致命:尝试访问字段-1
。更改
$(NF-1)=“发生”
NF>1&&$(NF-1)=“发生”
然后您想将
level==stack[s,“level”]
更改为
level&&level==stack[s,“level”]
您能对代码进行注释吗?我不熟悉ruby…谢谢!)