【问题标题】:Remove duplicates on specific record type using JCL sort使用 JCL 排序删除特定记录类型的重复项
【发布时间】: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 标记了您的问题,您使用的是哪种排序产品?另外,请向我们展示您的尝试,以免我们重复您的努力。

标签: mainframe 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 作为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
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-13
      • 1970-01-01
      • 2012-01-03
      • 2022-07-13
      • 2015-05-09
      相关资源
      最近更新 更多