Удалите дубликаты для определенного типа записи, используя сортировку JCL

не могли бы вы помочь мне достичь цели сортировки JCL ниже? У меня есть входной файл с другим набором записей. Мне нужно удалить дубликаты только определенного типа записи на основе позиции 10,04. В других типах записей не должно быть никаких изменений.

Мне нужно удалить дубликаты оли для P4 на позиции 10,4.

Вход:

P1AAAAAAAA0101xxxxxxx

P2AAAAAAAA0101xxxxxxx

P4AAAAAAAA0101ххххххх

P4AAAAAAAA0101ххххххх

P4AAAAAAAA0102xxxxxxx

P4AAAAAAAA0103xxxxxxx

P4AAAAAAA0104xxxxxxx

P5AAAAAAAA0101xxxxxxx

P7AAAAAAAA0101xxxxxxx

P9AAAAAAAA0101xxxxxxx

ОЖИДАЕМЫЙ РЕЗУЛЬТАТ:

P1AAAAAAAA0101xxxxxxx

P2AAAAAAAA0101xxxxxxx

P4AAAAAAAA0101ххххххх

P4AAAAAAAA0102xxxxxxx

P4AAAAAAAA0103xxxxxxx

P4AAAAAAA0104xxxxxxx

P5AAAAAAAA0101xxxxxxx

P7AAAAAAAA0101xxxxxxx

P9AAAAAAAA0101xxxxxxx


person Sekhar    schedule 11.01.2019    source источник
comment
Что вы пробовали???. Вы можете попробовать поискать в Google сортировка мейнфреймов, удалить дубликаты. В любом случае посмотрите на SUM FIELDS=NONE   -  person Bruce Martin    schedule 11.01.2019
comment
Уважаемый Брюс, я знаю об общей сортировочной карте для удаления дубликатов, но мое требование отличается. не могли бы вы пройти через один раз получить и предложить, пожалуйста.   -  person Sekhar    schedule 11.01.2019
comment
Вы отметили свой вопрос как dfsort, так и syncsort, какой продукт сортировки вы используете? Кроме того, пожалуйста, покажите нам, что вы пробовали, чтобы мы не дублировали ваши усилия.   -  person cschneid    schedule 11.01.2019


Ответы (2)


Хочу представить вам небольшое решение, Немного сложное, но работает, может у кого найдется другое, более компактное, чем мое:

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

С уважением, Андреас

person Andreas    schedule 11.01.2019

Ну вот.

//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 для установки порядковых номеров в конце записи. Порядковые номера устанавливаются равными 1 для записей с первыми 2 байтами как 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

Надеюсь это поможет.

person Srinivasan JV    schedule 15.01.2019