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

Posted

技术标签:

【中文标题】使用 JCL 排序删除特定记录类型的重复项【英文标题】:Remove duplicates on specific record type using JCL sort 【发布时间】:2019-01-11 06:43:46 【问题描述】:

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

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

输入:

P1AAAAAAA0101xxxxxxx

P2AAAAAAA0101xxxxxxx

P4AAAAAAA0101xxxxxxx

P4AAAAAAA0101xxxxxxx

P4AAAAAAA0102xxxxxxx

P4AAAAAAA0103xxxxxxx

P4AAAAAAA0104xxxxxxx

P5AAAAAAA0101xxxxxxx

P7AAAAAAA0101xxxxxxx

P9AAAAAAA0101xxxxxxx

预期输出:

P1AAAAAAA0101xxxxxxx

P2AAAAAAA0101xxxxxxx

P4AAAAAAA0101xxxxxxx

P4AAAAAAA0102xxxxxxx

P4AAAAAAA0103xxxxxxx

P4AAAAAAA0104xxxxxxx

P5AAAAAAA0101xxxxxxx

P7AAAAAAA0101xxxxxxx

P9AAAAAAA0101xxxxxxx

【问题讨论】:

你试过什么???。您可以尝试谷歌搜索大型机排序删除重复项。随便看看 SUM FIELDS=NONE 亲爱的布鲁斯,我知道通用排序卡可以删除重复项,但我的要求不同。你能不能通过一次获得并建议。 您已使用 dfsort 和 syncsort 标记了您的问题,您使用的是哪种排序产品?另外,请向我们展示您的尝试,以免我们重复您的努力。 【参考方案1】:

我想向您介绍一个小解决方案,虽然有点复杂但很有效,也许有人会有另一个比我更紧凑的解决方案:

//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)

问候, 安德烈亚斯

【讨论】:

【参考方案2】:

给你。

//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 作为P4SORT 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

希望这会有所帮助。

【讨论】:

以上是关于使用 JCL 排序删除特定记录类型的重复项的主要内容,如果未能解决你的问题,请参考以下文章

使用postgresql TEXT类型按字段排序时如何删除重复项?

从表中的多个重复项中删除特定记录

使用 JCL 排序在 x 条记录后写入字符

makefile:删除重复的单词而不进行排序

通过排序和过滤删除重复项

从排序数组中删除重复项