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

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

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

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

пример infile:

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)

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

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

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

2 ответа

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

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

Я смог достичь ожидаемого результата, используя два шага 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, чтобы напечатать количество записей в последний раз.

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

Другие вопросы по тегам