使用 JCL 排序删除特定记录类型上的重复项

问题描述 投票:0回答:2

您能帮助我实现以下 JCL 排序目标吗? 我的输入文件具有不同的 set if 记录。我需要根据 10,04 位置仅删除特定记录类型的重复项。其他类型的记录不应有任何变化。

我需要删除位置 10,4 上 P4 的重复项。

输入:

P1AAAAAAA0101xxxxxxx

P2AAAAAAA0101xxxxxxx

P4AAAAAAA0101xxxxxxx

P4AAAAAAA0101xxxxxxx

P4AAAAAAA0102xxxxxxx

P4AAAAAAA0103xxxxxxx

P4AAAAAAA0104xxxxxxx

P5AAAAAAA0101xxxxxxx

P7AAAAAAA0101xxxxxxx

P9AAAAAA0101xxxxxxx

预期输出:

P1AAAAAAA0101xxxxxxx

P2AAAAAAA0101xxxxxxx

P4AAAAAAA0101xxxxxxx

P4AAAAAAA0102xxxxxxx

P4AAAAAAA0103xxxxxxx

P4AAAAAAA0104xxxxxxx

P5AAAAAAA0101xxxxxxx

P7AAAAAAA0101xxxxxxx

P9AAAAAA0101xxxxxxx

mainframe dfsort syncsort
2个回答
0
投票

我想向您展示一个小解决方案,有点复杂,但它有效,也许有人会有另一个,比我的更紧凑:

//S1       EXEC  PGM=ICETOOL                                    
//TOOLMSG  DD SYSOUT=*                                          
//DFSMSG   DD SYSOUT=*                                          
//IN       DD *                                                 
P1AAAAAAA0101xxxxxxx                                            
P2AAAAAAA0101xxxxxxx                                            
P4AAAAAAA0101xxxxxxx                                            
P4AAAAAAA0101xxxxxxx                                            
P4AAAAAAA0102xxxxxxx                                            
P4AAAAAAA0103xxxxxxx                                            
P4AAAAAAA0104xxxxxxx                                            
P5AAAAAAA0101xxxxxxx                                            
P7AAAAAAA0101xxxxxxx                                            
P7AAAAAAA0101xxxxxxx                                            
P9AAAAAAA0101xxxxxxx                                            
//T1       DD DSN=&&T1,UNIT=SYSDA,SPACE=(CYL,(5,5)),DISP=(,PASS)
//T2       DD DSN=&&T2,UNIT=SYSDA,SPACE=(CYL,(5,5)),DISP=(,PASS)
//T3       DD DSN=&&T3,UNIT=SYSDA,SPACE=(CYL,(5,5)),DISP=(,PASS)
//OUT      DD SYSOUT=*                                          
//TOOLIN   DD *                                                 
 COPY     FROM(IN)    TO(T1)  USING(AST1)                       
 COPY     FROM(IN)    TO(T2)  USING(AST2)                       
 SELECT   FROM(T1)    TO(T3)  ON(10,4,CH) NODUPS                
 MERGE    FROM(T2,T3) TO(OUT) USING(AST3)                       
//AST1CNTL DD *                
 INCLUDE COND=(1,2,CH,EQ,C'P4')
//AST2CNTL DD *                
 INCLUDE COND=(1,2,CH,NE,C'P4')
//AST3CNTL DD *                
 MERGE FIELDS=(1,14,CH,A)

问候, 安德烈亚斯


0
投票

给你。

//JOBNAME  JOB 1,NOTIFY=&SYSUID            
//STEP1    EXEC PGM=SORT                                 
//SORTIN   DD *                                          
P1AAAAAAA0101XXXXXXX                                     
P2AAAAAAA0101XXXXXXX                                     
P4AAAAAAA0101XXXXXXX                                     
P4AAAAAAA0101XXXXXXX                                     
P4AAAAAAA0102XXXXXXX                                     
P4AAAAAAA0103XXXXXXX                                     
P4AAAAAAA0104XXXXXXX                                     
P5AAAAAAA0101XXXXXXX                                     
P7AAAAAAA0101XXXXXXX                                     
P9AAAAAAA0101XXXXXXX                                     
//SORTOUT  DD SYSOUT=*                                   
//SYSOUT   DD SYSOUT=*                                   
//SYSIN    DD *                                          
 INREC IFTHEN=(WHEN=INIT,BUILD=(1:1,20,21:SEQNUM,2,ZD)), 
       IFTHEN=(WHEN=(1,2,CH,EQ,C'P4'),OVERLAY=(21:C'01'))
 SORT FIELDS=(1,2,CH,A,10,4,CH,A,21,2,CH,A)              
 SUM FIELDS=NONE                                         
 OUTREC FIELDS=(1:1,20) 
  • 我使用
    INREC IFTHEN
    在末尾设置序列号 记录。对于前 2 个字节的记录,序列号设置为 1 作为
    P4
  • SORT FIELDS
    语句中包含的控制字段是前2个 字节,第 10 列到 4 个字节和第 21 列到 2 个字节(序列号)。
  • 请注意,P4 中重复记录的序列号将为 1。所以
    SUM FIELDS=NONE
    将仅删除这些记录。

输出:

P1AAAAAAA0101XXXXXXX
P1AAAAAAA0101XXXXXXX
P2AAAAAAA0101XXXXXXX
P4AAAAAAA0101XXXXXXX
P4AAAAAAA0102XXXXXXX
P4AAAAAAA0103XXXXXXX
P4AAAAAAA0104XXXXXXX
P5AAAAAAA0101XXXXXXX
P7AAAAAAA0101XXXXXXX
P9AAAAAAA0101XXXXXXX 

让我们使用以下输入运行同一组 SORT 语句。请注意,前 2 条记录 (P1) 与 P4 是重复的。

//JOBNAME  JOB 1,NOTIFY=&SYSUID                           
//STEP1    EXEC PGM=SORT                                  
//SORTIN   DD *                                           
P1AAAAAAA0101XXXXXXX                                      
P1AAAAAAA0101XXXXXXX                                      
P2AAAAAAA0101XXXXXXX                                      
P4AAAAAAA0101XXXXXXX                                      
P4AAAAAAA0101XXXXXXX                                      
P4AAAAAAA0102XXXXXXX                                      
P4AAAAAAA0103XXXXXXX                                      
P4AAAAAAA0104XXXXXXX                                      
P5AAAAAAA0101XXXXXXX                                      
P7AAAAAAA0101XXXXXXX                                      
P9AAAAAAA0101XXXXXXX                                      
//SORTOUT  DD SYSOUT=*                                    
//SYSOUT   DD SYSOUT=*                                    
//SYSIN    DD *                                           
 INREC IFTHEN=(WHEN=INIT,BUILD=(1:1,20,21:SEQNUM,2,ZD)),  
       IFTHEN=(WHEN=(1,2,CH,EQ,C'P4'),OVERLAY=(21:C'01')) 
 SORT FIELDS=(1,2,CH,A,10,4,CH,A,21,2,CH,A)               
 SUM FIELDS=NONE                                          
 OUTREC FIELDS=(1:1,20)                                   

运行作业后的输出如下所示。请注意,重复的 P1 记录将被保留,并且仅删除具有特定记录类型 (P4) 的重复记录。

P1AAAAAAA0101XXXXXXX
P1AAAAAAA0101XXXXXXX
P2AAAAAAA0101XXXXXXX
P4AAAAAAA0101XXXXXXX
P4AAAAAAA0102XXXXXXX
P4AAAAAAA0103XXXXXXX
P4AAAAAAA0104XXXXXXX
P5AAAAAAA0101XXXXXXX
P7AAAAAAA0101XXXXXXX
P9AAAAAAA0101XXXXXXX

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.