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