REXX/SORT разделить последовательный файл

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

line1
line2
line3
start line4
line5
line6

В этом случае мне нужно найти "start" и скопировать все, начиная с строки 4, в другой файл, используя REXX или SORT. Какие-либо предложения?

РЕДАКТИРОВАТЬ: То, что я думал, но не доволен в REXX

"EXECIO * DISKR INPUT (STEM INPUT. FINIS)" 
LINEINPUT = 1 
LINEOUTPUT = 1 
FOUND = 0 /*working like a boolean? 
DO WHILE LINEINPUT <= INPUT.0 
  IF INPUT.LINEINPUT = start line4 THEN DO 
  FOUND = 1 
  END 
  IF FOUND = 1 THEN DO 
    INPUT.LINEINPUT = OUTPUT.LINEOUTPUT 
    LINEOUTPUT = LINEOUTPUT + 1 
  END 
LINEINPUT = LINEINPUT + 1 
END

Может быть, что-то вроде этого, но это означает, что мне нужно построчно просматривать все эти файлы. Может быть, есть лучший способ в JCL? Может быть, Syncsort может сделать что-то подобное?

RECFM исправлен. FBA, чтобы быть точным. LRECL 170. Триггер может быть частью этой строки или всей строки. Это не важно, потому что это всегда одна и та же строка в каждом отдельном файле, и даже первые несколько символов уникальны во всем файле. Означает, что "запуск" появляется только один раз в файле.

2 ответа

Решение

Для запуска триггера с фиксированной позиции:

  OPTION COPY
  INREC IFTHEN=(WHEN=GROUP,
                 BEGIN=(1,5,CH,EQ,C'start'),
                 PUSH=(171:ID=1))
  OUTFIL OMIT=(171,1,CH,EQ,C' '),
         BUILD=(1,170)

Для переменной с уникальным положением, триггер:

  OPTION COPY
  INREC IFTHEN=(WHEN=GROUP,
                 BEGIN=(1,170,SS,EQ,C'start'),
                 PUSH=(171:ID=1))
  OUTFIL OMIT=(171,1,CH,EQ,C' '),
         BUILD=(1,170)

WHEN=GROUP дает тебе PUSH, в который будут помещены данные из текущей записи или номер группы (ID) или номер в группе (SEQ), на эту позицию на всех записях в группе (включая текущую запись). В этом случае "группа" является остальной частью файла.

SS является типом поля, разрешающим поиск подстроки.

Тогда OMIT= (похожий на OMIT COND= но после того, как файл был обработан контрольными карточками) на OUTFIL делает фактический выбор из флага (автоматически расширенные записи, не имеющие значения из PUSH, будут установлены как пустые) и BUILD, чтобы сбросить дополнительный байт.

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

Извините, что не комментирую, так как у меня недостаточно репутации, я пишу это в ответ. Уберу это позже

Вы можете достичь этого обоими способами, то есть через REXX или JCL. Пожалуйста, покажите нам, что вы пробовали до сих пор, чтобы мы могли выяснить, что улучшить.

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