Mainframe DFSORT:按分组计数筛选每组前2条记录
用Mainframe DFSORT实现分组统计并筛选前2条记录
需求说明
对输入文件按FILE_NAME和DATA_REC字段分组,统计每组的出现次数,针对每个FILE_NAME保留计数最高的前2组记录,最终输出包含FILE_NAME、DATA_REC及对应计数的结果。
实现方案
使用DFSORT的ICETOOL工具结合排序、统计、分段筛选完成,具体JCL及控制语句如下:
//SORTJOB JOB (ACCT),'GROUP COUNT',CLASS=A,MSGCLASS=X //* //ICETOOL EXEC PGM=ICETOOL //TOOLMSG DD SYSOUT=* //DFSMSG DD SYSOUT=* //INDD DD DSN=你的输入数据集名称,DISP=SHR //TEMPDDS DD DSN=&&TEMP,DISP=(,PASS),SPACE=(CYL,(5,5),RLSE) //OUTDD DD DSN=你的输出数据集名称,DISP=(NEW,CATLG,DELETE), // SPACE=(CYL,(5,5),RLSE),DCB=(RECFM=FB,LRECL=80,BLKSIZE=0) //* //TOOLIN DD * COUNT FROM(INDD) TO(TEMPDDS) ON(1,9,CH) ON(11,9,CH) - USING(CTL1) /* //CTL1CNTL DD * OUTFIL FNAMES=TEMPDDS,BUILD=(1,9,X,11,9,X,COUNT=(M11,LENGTH=8)) /* //* //SORTSTEP EXEC PGM=SORT //SYSOUT DD SYSOUT=* //SORTIN DD DSN=&&TEMP,DISP=(OLD,PASS) //SORTOUT DD DSN=&&SORTED,DISP=(,PASS),SPACE=(CYL,(5,5),RLSE) //SYSIN DD * SORT FIELDS=(1,9,CH,A,20,8,ZD,D) /* //* //FINAL EXEC PGM=SORT //SYSOUT DD SYSOUT=* //SORTIN DD DSN=&&SORTED,DISP=(OLD,PASS) //SORTOUT DD DSN=&&FINAL,DISP=(,PASS),SPACE=(CYL,(5,5),RLSE) //SYSIN DD * OPTION COPY OUTFIL FNAMES=SORTOUT, SEGMENT=(ID=(1,9,CH),PREFIX=(''),SUFFIX=(''), FIRST=2, BUILD=(1,9,X,11,9,X,20,8,ZD,TO=CCITT,LENGTH=8)) /* //* //PRINTSTEP EXEC PGM=SORT //SYSOUT DD SYSOUT=* //SORTIN DD DSN=&&FINAL,DISP=(OLD,PASS) //SORTOUT DD DSN=你的输出数据集名称,DISP=(OLD,CATLG) //SYSIN DD * OPTION COPY OUTFIL FNAMES=SORTOUT, REMOVECC, OUTREC=(1,9,X,11,9,X,20,8,ZD,EDIT=(IITTT),SIGNS=(+,-)) /*
代码说明
- 分组统计:通过
ICETOOL COUNT命令,按FILE_NAME(位置1-9)和DATA_REC(位置11-9)分组统计次数,结果写入临时数据集TEMPDDS,输出格式为FILE_NAME DATA_REC 计数。 - 排序:对临时数据集按
FILE_NAME升序、计数降序排序,保证每个FILE_NAME下的记录按计数从高到低排列。 - 分段筛选:使用
OUTFIL SEGMENT功能,以FILE_NAME为分段标识,仅保留每个分段的前2条记录。 - 格式调整:最后调整计数的输出格式,移除多余控制字符,生成符合要求的最终输出。
注意事项
- 需根据实际输入文件的字段位置,调整
ON(1,9,CH)和ON(11,9,CH)中的位置参数。 - 输出数据集的
LRECL和RECFM需结合实际需求调整,示例使用FB/80格式。
内容的提问来源于stack exchange,提问作者mayank
相关产品推荐
相关产品推荐

