テキストにある文字列ブロックを挿入する


1 test1
1 test2
1 test3
2 test1
2 test2
2 test3
2 test4
3 test1
3 test2
3 test3

というファイルを以下のようにしたいというものです。

1 beg
1 test1
1 test2
1 test3
1 end
2 beg
2 test1
2 test2
2 test3
2 test4
2 end
3 beg
3 test1
3 test2
3 test3
3 end
||<<

そこで無理して作ったのか以下のようなもので、これを直して欲しいというものです。

>|awk|
awk '{
      old=new
      new=$1
     }
    $1 != old {
         if (oline) print oline
         newl=$0
         $2="beg"
         print $0
         print newl
         old=$1
         next
     }
    $1 == old { print; $2="end"; oline=$0 }
     END {print oline}
    '

回答は以下のようなものです。

$1 != prev { print (prev ? prev " end" ORS : "") $1 " beg"; prev=$1 }
1
END { print prev " end" }
$1 != prev { pre() }
$1 != prev { print $1, "beg"; prev = $1 }
1
END { pre() }

function pre() {
  if (prev) print prev, "end"

}
$1 != prev { pre(); print $1, "beg"; prev = $1 }
1
one!=(now=$1){print (NR==1?"":"end"ORS)"beg"ORS $0;one=now;next}
1
END{print "end"}