z/OS Syncsort: пропускать дубликаты без сортировки

По мануалу не понять, как справиться с этой проблемой с помощью syncsort (мы нашли решения с dfsort, которые не помогли). Из-за программной ошибки (которую вовремя не исправить: программист, тест, проверка качества, деплоймент...) мы получили дубликаты записей в файле (FB/LRECL 250), где потом

  • строка заголовка существует
  • последующие повторяющиеся строки данных, которые должны быть опущены, но одна уникальная
  • строки данных не должны быть отсортированы (из-за обязательной логической связи некоторых записей)
  • трейлер включает количество строк данных.

Файл нельзя редактировать вручную из-за его размера (>2 млн. записей).

пример файла:

HEADER xxxx
cccc
bbbb 123
bbbb 123
bbbb 123
dddd
aaaa 123
aaaa 123
aaaa
TRAILER COUNT: 8

Ожидаемый выходной файл:

HEADER xxxx
cccc
bbbb 123         
dddd
aaaa 123
aaaa
TRAILER COUNT: 5

Таким образом, выходной файл вообще не сортируется, пропущенные записи

bbbb 123         (omitted)
bbbb 123         (omitted)
aaaa 123         (omitted)

вообще не нужны и могут уйти прямо в нирвану.

(Я был бы даже счастлив, если бы в решении не было заголовка/трейлера, поскольку я мог бы легко объединить сгенерированные вручную строки в последующем задании.)

Спасибо за вашу помощь!


person mideal    schedule 29.11.2017    source источник


Ответы (2)


Я смог добиться ожидаемого результата, используя два шага SYNCSORT.

Шаг 1:

INREC FIELDS=(1:SEQNUM,4,ZD,5:1,8)
SORT FIELDS=(5,8,CH,A),SKIPREC=1  
SUM FIELDS=NONE

Используя INREC, я добавил порядковый номер в первые 4 байта, за которыми следует фактическая запись данных. Затем я отсортировал файл с первыми 8 байтами в качестве ключа. Запись заголовка пропускается с помощью SKIPREC.

Шаг 2:

SORT FIELDS=(1,4,CH,A)                                              
OUTFIL FNAMES=SORTOF01,REMOVECC,                                    
OUTREC=(1:5,8,80:X),TRAILER1=('TRAILER COUNT:',COUNT=(M11,LENGTH=8))

На шаге 2 выходной файл из шага 1 считывается как входной. Поскольку вы ожидаете, что строки данных не будут отсортированы, я отсортировал ввод с порядковым номером в качестве ключа. Используя OUTREC, я воздерживаюсь от записи порядкового номера в окончательный выходной файл. Я использовал TRAILER1 для вывода количества записей в последнюю очередь.

Надеюсь это поможет. Пожалуйста, дайте мне знать, если у вас есть альтернатива, которая работает более эффективно.

person Srinivasan JV    schedule 18.12.2017

См. мою сортировочную карту ниже. Он построен для вашего образца данных, показанного выше.

//SORTOUT DD SYSOUT=*                                                 
//SYSIN DD *                                                          
 OPTION COPY                                                          
 INREC FIELDS=(1,50,SEQNUM,7,ZD,RESTART=(1,8))                        
 OUTFIL REMOVECC,OMIT=(51,7,ZD,GT,01,|,1,7,CH,EQ,C'TRAILER'),         
        OUTREC=(1,50),TRAILER1=(C'TRAILER COUNT:',COUNT-1=(M11,LENGTH=8))
/*             
person Karthick    schedule 31.12.2017