大型机DFSORT:按计数获取每组前N 条记录

编程语言 2026-07-10

我有一个输入文件,其记录如下:

FILE_NAME1 DATA_REC_1 

FILE_NAME1 DATA_REC_2 
FILE_NAME1 DATA_REC_2 
FILE_NAME1 DATA_REC_2 

FILE_NAME1 DATA_REC_3 
FILE_NAME1 DATA_REC_3 
FILE_NAME1 DATA_REC_3 
FILE_NAME1 DATA_REC_3 

FILE_NAME2 DATA_REC_1 

FILE_NAME2 DATA_REC_2 

FILE_NAME2 DATA_REC_3 
FILE_NAME2 DATA_REC_3 
FILE_NAME2 DATA_REC_3 
FILE_NAME2 DATA_REC_3 
FILE_NAME2 DATA_REC_3 
FILE_NAME2 DATA_REC_3 

FILE_NAME2 DATA_REC_4 
FILE_NAME2 DATA_REC_4 
FILE_NAME2 DATA_REC_4 

FILE_NAME3 DATA_REC_7

我想按照File_Name和 Data_rec对它们进行分组,并从每组中选出出现次数最多的前两个,并给出它们的计数,如下所示。

FILE_NAME1 DATA_REC_3  4
FILE_NAME1 DATA_REC_2  3

FILE_NAME2 DATA_REC_3  6
FILE_NAME2 DATA_REC_4  3

FILE_NAME3 DATA_REC_7  1

请你指引我走向正确的方向。

解决方案

假设你的FILENAME位于前10个字节,数据记录位于第11至第21字节,下面的DFSORT/ICETOOL JCL将给出你所需的结果。

//STEP0100 EXEC PGM=ICETOOL                                           
//TOOLMSG  DD SYSOUT=*                                                
//DFSMSG   DD SYSOUT=*                                                
//INP      DD *                                                       
FILE_NAME1 DATA_REC_1                                                 
FILE_NAME1 DATA_REC_2                                                 
FILE_NAME1 DATA_REC_2                                                 
FILE_NAME1 DATA_REC_2                                                 
FILE_NAME1 DATA_REC_3                                                 
FILE_NAME1 DATA_REC_3                                                 
FILE_NAME1 DATA_REC_3                                                 
FILE_NAME1 DATA_REC_3                                                 
FILE_NAME2 DATA_REC_1                                                 
FILE_NAME2 DATA_REC_2                                                 
FILE_NAME2 DATA_REC_3                                                 
FILE_NAME2 DATA_REC_3                                                 
FILE_NAME2 DATA_REC_3                                                 
FILE_NAME2 DATA_REC_3                                                 
FILE_NAME2 DATA_REC_3                                                 
FILE_NAME2 DATA_REC_3                                                 
FILE_NAME2 DATA_REC_4                                                 
FILE_NAME2 DATA_REC_4                                                 
FILE_NAME2 DATA_REC_4                                                 
FILE_NAME3 DATA_REC_7                                                 
//TMP      DD DSN=&&TEMP,DISP=(,PASS),SPACE=(TRK,(1,1),RLSE)          
//OUT      DD SYSOUT=*                                                
//TOOLIN   DD *                                                       
  SORT FROM(INP) TO(TMP) USING(CTL1)                                  
  SORT FROM(TMP) TO(OUT) USING(CTL2)                                  
/*                                                                    
//CTL1CNTL DD *                                                       
  INREC BUILD=(01,21,                             # FILENAME + DATAREC
               C'00000001')                       # INIT COUNT = 1    

   SORT FIELDS=(01,21,CH,A)                       # FILENAME + DATAREC
    SUM FIELDS=(22,08,ZD)                         # SUM COUNTER       
/*                                                                    
//CTL2CNTL DD *                                                      
  SORT FIELDS=(01,10,CH,A,                        # FILENAME         
               22,08,CH,D)                        # COUNT DESC       

  OUTREC OVERLAY=(32:SEQNUM,8,ZD,                 # NUMBER THE DUPS  
                     RESTART=(01,10))               BASED ON FILENAME

  OUTFIL INCLUDE=(32,08,ZD,LE,2),                 # INCLUDE TOP 2    
  BUILD=(01,21,22,08,ZD,M10,LENGTH=8)             # BUILD RECORD     
/*

该作业的输出将是

FILE_NAME1 DATA_REC_3       4  
FILE_NAME1 DATA_REC_2       3  
FILE_NAME2 DATA_REC_3       6  
FILE_NAME2 DATA_REC_4       3  
FILE_NAME3 DATA_REC_7       1
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章