Hi,
I have a report starting with first two lines of header and these headers appear after page breaks.
I had to read data from this file and process. I want to keep the first set of headers and copy as it is in the output file but want
to get rid of other headers. How can we do it using sort?
input
----------
1HEADER LINE 1 RUN DATE
HEADER LINE 2
122345576777777777
8888
888888888
99999999
00000987GFFFDSD
456GTREYEYTYEWY
1HEADER LINE 1 RUN DATE
HEADER LINE 2
sdhjlkqkjqdwklwqDSAJDSSDss
SHyuiu q ewdsa
sdsasdsDAfiqeqwoeq
sahjsdakjsadjdjd
Output
-------------
1HEADER LINE 1 RUN DATE
HEADER LINE 2
122345576777777777
8888
888888888
99999999
00000987GFFFDSD
456GTREYEYTYEWY
sdhjlkqkjqdwklwqDSAJDSSDss
SHyuiu q ewdsa
sdsasdsDAfiqeqwoeq
sahjsdakjsadjdjd
Joined: 09 Mar 2011 Posts: 7309 Location: Inside the Matrix
Add a sequence number in the Sort, OMIT heading lines if sequence number greater than two, loose the sequence number (BUILD for instance) before final output.
//SRTJK EXEC PGM=ICETOOL
//TOOLMSG DD SYSOUT=*
//DFSMSG DD SYSOUT=*
//IN1 DD *
1HEADER LINE 1 RUN DATE
HEADER LINE 2
122345576777777777
8888
888888888
99999999
00000987GFFFDSD
456GTREYEYTYEWY
1HEADER LINE 1 RUN DATE
HEADER LINE 2
SDHJLKQKJQDWKLWQDSAJDSSDSS
SHYUIU Q EWDSA
SDSASDSDAFIQEQWOEQ
SAHJSDAKJSADJDJD
//SYSOUT DD SYSOUT=*
//T2 DD SYSOUT=*
//T1 DD DSN=&&T1,SPACE=(TRK,(5,5)),
// DISP=(MOD,PASS)
//TOOLIN DD *
COPY FROM(IN1) TO(T1) USING(CTL1)
COPY FROM(T1) TO(T2) USING(CTL2)
//*
//CTL1CNTL DD *
INREC IFTHEN=(WHEN=(2,14,CH,EQ,C'HEADER LINE 1'),
BUILD=(1:1,80,81:SEQNUM,4,ZD)),
IFTHEN=(WHEN=(1,13,CH,EQ,C'HEADER LINE 2'),
BUILD=(1:1,80,81:SEQNUM,4,ZD))
//CTL2CNTL DD *
OMIT COND=(81,4,ZD,GT,1)
OUTREC FIELDS=(1,80)
Output
Code:
1HEADER LINE 1 RUN DATE
HEADER LINE 2
122345576777777777
8888
888888888
99999999
00000987GFFFDSD
456GTREYEYTYEWY
SDHJLKQKJQDWKLWQDSAJDSSDSS
SHYUIU Q EWDSA
SDSASDSDAFIQEQWOEQ
SAHJSDAKJSADJDJD
Joined: 20 Oct 2006 Posts: 6966 Location: porcelain throne
what if there are 3 headers?
suggested control cards (check syntax, probably not correct) based on Bill's solution
UNTESTED
INREC BUILD=(1:1,80,81:SEQNUM,6,ZD)
OUTREC/OUTFIL OMIT=((2,11,CH,EQ,C'HEADER LINE') AND (81,6,ZD,GT,2)),FIELDS=(1,80)
suggested control cards (check syntax, probably not correct) based on Bill's solution
UNTESTED
INREC BUILD=(1:1,80,81:SEQNUM,6,ZD)
OUTREC/OUTFIL OMIT=((2,11,CH,EQ,C'HEADER LINE') AND (81,6,ZD,GT,2)),FIELDS=(1,80)
one pass
Even if there are 5 headers the CTL1 one should be modified like
Code:
//TOOLIN DD *
COPY FROM(IN1) TO(T1) USING(CTL1)
COPY FROM(T1) TO(T2) USING(CTL2)
//*
//CTL1CNTL DD *
INREC IFTHEN=(WHEN=(2,14,CH,EQ,C'HEADER LINE 1'),
BUILD=(1:1,80,81:SEQNUM,4,ZD)),
IFTHEN=(WHEN=(1,13,CH,EQ,C'HEADER LINE 2'),
BUILD=(1:1,80,81:SEQNUM,4,ZD))
IFTHEN=(WHEN=(1,13,CH,EQ,C'HEADER LINE 3'),
BUILD=(1:1,80,81:SEQNUM,4,ZD))
IFTHEN=(WHEN=(1,13,CH,EQ,C'HEADER LINE 4'),
BUILD=(1:1,80,81:SEQNUM,4,ZD))
IFTHEN=(WHEN=(1,13,CH,EQ,C'HEADER LINE 5'),
BUILD=(1:1,80,81:SEQNUM,4,ZD))
//CTL2CNTL DD *
OMIT COND=(81,4,ZD,GT,1)
OUTREC FIELDS=(1,80)
This solution should work not sure about efficiency
Thanks Bill and I have modified your advice slightly
One pass
Code:
SORT FIELDS=COPY
INREC IFTHEN=(WHEN=(2,14,CH,EQ,C'HEADER LINE 1'),
OVERLAY=(81:SEQNUM,4,ZD)),
IFTHEN=(WHEN=(1,13,CH,EQ,C'HEADER LINE 2'),
OVERLAY=(81:SEQNUM,4,ZD)),
IFTHEN=(WHEN=(1,13,CH,EQ,C'HEADER LINE 3'),
OVERLAY=(81:SEQNUM,4,ZD)),
IFTHEN=(WHEN=(1,13,CH,EQ,C'HEADER LINE 4'),
OVERLAY=(81:SEQNUM,4,ZD)),
IFTHEN=(WHEN=(1,13,CH,EQ,C'HEADER LINE 5'),
OVERLAY=(81:SEQNUM,4,ZD))
OUTFIL OMIT=(81,4,CH,GT,C'0001'),BUILD=(1,80)
Joined: 07 Dec 2007 Posts: 2205 Location: San Jose
utkarshtewari,
Using WHEN=GROUP with RECORDS=n will be much easier to tag the header records and eliminate them. You don't have to validate each and every header record. You just need to identify the first header record and change the value of N in RECORD=n parameter to tag them. In your sample you showed 2 headers. So use RECORDS=2.
Code:
//STEP0100 EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTIN DD *
1HEADER LINE 1 RUN DATE
HEADER LINE 2
122345576777777777
8888
888888888
99999999
00000987GFFFDSD
456GTREYEYTYEWY
1HEADER LINE 1 RUN DATE
HEADER LINE 2
SDHJLKQKJQDWKLWQDSAJDSSDSS
SHYUIU Q EWDSA
SDSASDSDAFIQEQWOEQ
SAHJSDAKJSADJDJD
//SORTOUT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=COPY
INREC IFTHEN=(WHEN=GROUP,BEGIN=(1,7,CH,EQ,C'1HEADER'),
RECORDS=2,PUSH=(81:ID=5))
OUTFIL BUILD=(1,80),OMIT=(81,5,ZD,GT,1)
//*
will produce
Code:
1HEADER LINE 1 RUN DATE
HEADER LINE 2
122345576777777777
8888
888888888
99999999
00000987GFFFDSD
456GTREYEYTYEWY
SDHJLKQKJQDWKLWQDSAJDSSDSS
SHYUIU Q EWDSA
SDSASDSDAFIQEQWOEQ
SAHJSDAKJSADJDJD