awk pattern match and search in single statement

Hi All,
I am trying to alter all lines between EXEC SQL and END-EXEC that have an INCLUDE in them.

The following code

search="INCLUDE "
  cp -f ${WORK}/$file.in ${WORK}/$file.wrk2
  for item in `echo $search `; do
      >  ${WORK}/$file.wrk1
      awk  -vITEM="$item" '{
          if ( $0 ~ ITEM ) {
             savetext = substr($0,1,80);
             col7 = substr($0,7,1);
             print "MIGAU1" col7 "       BEGIN DECLARE SECTION"
             print "MIGAU1" col7 "    END-EXEC."
             print "MIGAU1" col7 "    EXEC SQL"
             print savetext
             print "MIGAU1" col7 "    END-EXEC."
             print "MIGAU1" col7 "    EXEC SQL"
             print "MIGAU1" col7 "       END DECLARE SECTION"
             }
         else { print $0 }
      }' ${WORK}/$file.wrk2 >> ${WORK}/$file.wrk1

works to alter the lines containing include but now I want to include the following pattern matching

awk '/EXEC SQL/,/END-EXEC/' filein 

I have tried

search="INCLUDE "
  cp -f ${WORK}/$file.in ${WORK}/$file.wrk2
  for item in `echo $search `; do
      >  ${WORK}/$file.wrk1
      awk  '/EXEC SQL/,/END-EXEC/' || -vITEM="$item" '{
          if ( $0 ~ ITEM ) {
             savetext = substr($0,1,80);
             col7 = substr($0,7,1);
             print "MIGAU1" col7 "       BEGIN DECLARE SECTION"
             print "MIGAU1" col7 "    END-EXEC."
             print "MIGAU1" col7 "    EXEC SQL"
             print savetext
             print "MIGAU1" col7 "    END-EXEC."
             print "MIGAU1" col7 "    EXEC SQL"
             print "MIGAU1" col7 "       END DECLARE SECTION"
             }
         else { print $0 }
      }' ${WORK}/$file.wrk2 >> ${WORK}/$file.wrk1

and various other things but the script just hangs when I do this.

Any help appreciated.

Please post sample input and an example of the desired output.

      *               |            |TABLE.                                         |V02.05 *
      * 02022010 |    JHH   |R10.2 SR8644 DYNAMICALLY SET       |V02.06 *
      *               |            |ACTIVITY FLAGS                            |V02.06 *
      *               |            |IPARM AMENDED TO INCLUDE OFFSET|V02.06 *
      *****************************************************************
V01.02
V01.02 01  FILLER                     PIC X(32)
V01.02     VALUE 'MHAA5J - CM_COSTELEMENT_SPLIT'.
V01.02     EXEC SQL
V01.02        INCLUDE MHRSCV01
V01.02     END-EXEC.
V01.02
V01.02 01  FILLER                     PIC X(32)
V01.02     VALUE 'MHAA5J - CM_DIV_PROD_ACTIVITY'.
V01.02     EXEC SQL
V01.02        INCLUDE MHRDAV01
V01.02     END-EXEC.

The first include must not be altered but the EXEC SQL .... END_EXEC statements containing the INCLUDE should be altered (Result shown below):

      *               |            |TABLE.                                         |V02.05 *
      * 02022010 |    JHH   |R10.2 SR8644 DYNAMICALLY SET       |V02.06 *
      *               |            |ACTIVITY FLAGS                            |V02.06 *
      *               |            |IPARM AMENDED TO INCLUDE OFFSET|V02.06 *
      *****************************************************************V01.02
V01.02 01  FILLER                     PIC X(32)
V01.02     VALUE 'MHAA5J - CM_COSTELEMENT_SPLIT'.
MIGAU1    EXEC SQL
MIGAU1       BEGIN DECLARE SECTION
MIGAU1    END-EXEC       
V01.02     EXEC SQL
V01.02        INCLUDE MHRSCV01
V01.02     END-EXEC.
MIGAU1    EXEC SQL
MIGAU1       END DECLARE SECTION
MIGAU1    END-EXEC       
V01.02
V01.02 01  FILLER                     PIC X(32)
V01.02     VALUE 'MHAA5J - CM_DIV_PROD_ACTIVITY'.
MIGAU1    EXEC SQL
MIGAU1       BEGIN DECLARE SECTION
MIGAU1    END-EXEC       
V01.02     EXEC SQL
V01.02        INCLUDE MHRDAV01
V01.02     END-EXEC.
MIGAU1    EXEC SQL
MIGAU1       END DECLARE SECTION
MIGAU1    END-EXEC       

Use gawk, /usr/xpg4/bin/awk or nawk on Solaris:

awk 'BEGIN {
  b = "MIGAU1\tEXEC SQL\nMIGAU1\t\t"
  b = b  "BEGIN DECLARE SECTION\nMIGAU1\tEND-EXEC"
  e = "MIGAU1\tEXEC SQL\nMIGAU1\t\tEND DECLARE SECTION"
  e = e "\nMIGAU1\tEND-EXEC"  
  }
/EXEC SQL/ { print b }
666
/END-EXEC/ { print e }
' infile

Edit: Just saw the "containing include" part, work in progress ... :slight_smile:

---------- Post updated at 05:21 PM ---------- Previous update was at 05:10 PM ----------

Use gawk or /usr/xpg4/bin/awk on Solaris:

awk 'BEGIN {
  b = "MIGAU1\tEXEC SQL\nMIGAU1\t\t"
  b = b  "BEGIN DECLARE SECTION\nMIGAU1\tEND-EXEC"
  e = "MIGAU1\tEXEC SQL\nMIGAU1\t\tEND DECLARE SECTION"
  e = e "\nMIGAU1\tEND-EXEC"  
  }
/EXEC SQL/, /END-EXEC/ { 
  r = r ? r RS $0 : $0
  /INCLUDE/ && ok ++
  if (/END-EXEC/) {
    if (ok) {
      print b RS r RS e
      r = ok = x
      }
  else {
    print r; r = x  
    }
  }	
  next	
  }-3' infile
1 Like