使用 DFSORT 对组中的记录进行计数
Counting records in a group using DFSORT
我有包含 JES2 作业输出的文件。我正在练习 DFSORT
以每个作业为基础从文件中检索一些信息。
我想要实现的一件事如下:
- 作业输出第一行
- 作业输出的最后一行
- 作业输出总行数(每个作业)
我设法在结果中获得了(完整输出的)总行数、作业编号和作业总行数:
(1) (2) (3)
000001 000001 000001 (1) Total lines
000002 000001 000002 (2) Job number
000003 000001 000003 (3) Lines in job
000004 000001 000004
000005 000001 000005
000006 000001 000006
000007 000001 000007
000008 000001 000008
...
000953 000001 000953
000954 000001 000954
000955 000001 000955
000956 000001 000956
000957 000001 000957
000958 000001 000958
000959 000001 000959
000960 000002 000001 <-- new job output starts here
000961 000002 000002
000962 000002 000003
000963 000002 000004
000964 000002 000005
000965 000002 000006
为了实现上述输出,我使用了以下 SYSIN DD
语句 (PGM=SORT):
第一行:
INREC OVERLAY=(135:SEQNUM,6,ZD,START=1,INCR=1)
INREC IFTHEN=(WHEN=GROUP,
BEGIN=(21,6,CH,EQ,C'J E S 2 '),
PUSH=(142:ID=6), <--- Second row
HIT=NEXT),
IFTHEN=(WHEN=GROUP,
BEGIN=(21,6,CH,EQ,C'J E S 2 '),
PUSH=(149:SEQ=6)) <--- 3th row
我想要达到的结果是这样的:
JOBNAME f_row l_row rowcnt
JOB12345 000001 000100 000099
JOB54321 000101 000500 000399
我目前遇到的问题是我不知道如何计算 rowcnt
列。我能够计算 rowcnt 列,但我只能在下一个作业的第一行执行此操作(通过 SUB
)。
我认为最好的方法是使用 IFTHEN
并将 rowcnt 推送到组中的所有记录,但我在过去 2 天里没有得到它。
此时我卡住了。我不再确定应该使用哪些语句来完成此操作。一些论坛提供了一种使用 2 个单独文件的方法,但在我的情况下这不是首选。
任何正确方向的指导将不胜感激。
我能够解决我的问题。我采取了以下步骤。
首先,我必须添加序列号,它计算总记录数、唯一作业数和单个作业中的记录数。我以前可以做到这一点,但我将之前的 2 个步骤合并为一个:
INREC BUILD=(135:SEQNUM,6,ZD,START=1,INCR=1)
OUTREC IFTHEN=(WHEN=GROUP,
BEGIN=(20,7,CH,EQ,C'J E S 2'),
PUSH=(142:ID=6),
HIT=NEXT),
IFTHEN=(WHEN=GROUP,
BEGIN=(20,7,CH,EQ,C'J E S 2'),
PUSH=(149:SEQ=6))
这会产生以下输出:
000952 000001 000952
000953 000001 000953
000954 000001 000954
000955 000001 000955
000956 000001 000956
000957 000001 000957
000958 000001 000958
000959 000001 000959
000960 000002 000001 <-- New job starts here
000961 000002 000002
000962 000002 000003
000963 000002 000004
000964 000002 000005
000965 000002 000006
000966 000002 000007
000967 000002 000008
000968 000002 000009
000969 000002 000010
000970 000002 000011
000971 000002 000012
000972 000002 000013
我的下一份工作是让工作中的最高记录数达到顶峰。我能够通过按降序对第二个排序输入进行排序来完成此操作,请参见下文。
我还添加了一个新行(在第 157 位)来推送最高记录数,以便我以后可以使用它。
SORT FIELDS=(142,6,ZD,A,135,6,ZD,D)
OUTREC IFTHEN=(WHEN=GROUP,
END=(20,7,CH,EQ,C'J E S 2'),
PUSH=(157:149,6))
上述步骤提供了以下输出(按第二列排序,然后是第一列)
000959 000001 000959 000959
000958 000001 000958 000959
000957 000001 000957 000959
000956 000001 000956 000959
000955 000001 000955 000959
...
000007 000001 000007 000959
000006 000001 000006 000959
000005 000001 000005 000959
000004 000001 000004 000959
000003 000001 000003 000959
000002 000001 000002 000959
000001 000001 000001 000959
001976 000002 001017 001017 <--- Next job starts, highest row count is 1017
001975 000002 001016 001017
001974 000002 001015 001017
001973 000002 001014 001017
001972 000002 001013 001017
001971 000002 001012 001017
001970 000002 001011 001017
001969 000002 001010 001017
001968 000002 001009 001017
001967 000002 001008 001017
001966 000002 001007 001017
在第四列中,我现在有作业中的总行数。剩下的就是恢复到原来的记录顺序。这是通过对相同的列进行排序来完成的,但是对第二个排序输入使用升序而不是降序。
SORT FIELDS=(142,6,ZD,A,135,6,ZD,A)
当回顾这个解决方案时,我在想办法太难了,导致我无法解决这个问题:)
我有包含 JES2 作业输出的文件。我正在练习 DFSORT
以每个作业为基础从文件中检索一些信息。
我想要实现的一件事如下:
- 作业输出第一行
- 作业输出的最后一行
- 作业输出总行数(每个作业)
我设法在结果中获得了(完整输出的)总行数、作业编号和作业总行数:
(1) (2) (3)
000001 000001 000001 (1) Total lines
000002 000001 000002 (2) Job number
000003 000001 000003 (3) Lines in job
000004 000001 000004
000005 000001 000005
000006 000001 000006
000007 000001 000007
000008 000001 000008
...
000953 000001 000953
000954 000001 000954
000955 000001 000955
000956 000001 000956
000957 000001 000957
000958 000001 000958
000959 000001 000959
000960 000002 000001 <-- new job output starts here
000961 000002 000002
000962 000002 000003
000963 000002 000004
000964 000002 000005
000965 000002 000006
为了实现上述输出,我使用了以下 SYSIN DD
语句 (PGM=SORT):
第一行:
INREC OVERLAY=(135:SEQNUM,6,ZD,START=1,INCR=1)
INREC IFTHEN=(WHEN=GROUP,
BEGIN=(21,6,CH,EQ,C'J E S 2 '),
PUSH=(142:ID=6), <--- Second row
HIT=NEXT),
IFTHEN=(WHEN=GROUP,
BEGIN=(21,6,CH,EQ,C'J E S 2 '),
PUSH=(149:SEQ=6)) <--- 3th row
我想要达到的结果是这样的:
JOBNAME f_row l_row rowcnt
JOB12345 000001 000100 000099
JOB54321 000101 000500 000399
我目前遇到的问题是我不知道如何计算 rowcnt
列。我能够计算 rowcnt 列,但我只能在下一个作业的第一行执行此操作(通过 SUB
)。
我认为最好的方法是使用 IFTHEN
并将 rowcnt 推送到组中的所有记录,但我在过去 2 天里没有得到它。
此时我卡住了。我不再确定应该使用哪些语句来完成此操作。一些论坛提供了一种使用 2 个单独文件的方法,但在我的情况下这不是首选。 任何正确方向的指导将不胜感激。
我能够解决我的问题。我采取了以下步骤。
首先,我必须添加序列号,它计算总记录数、唯一作业数和单个作业中的记录数。我以前可以做到这一点,但我将之前的 2 个步骤合并为一个:
INREC BUILD=(135:SEQNUM,6,ZD,START=1,INCR=1)
OUTREC IFTHEN=(WHEN=GROUP,
BEGIN=(20,7,CH,EQ,C'J E S 2'),
PUSH=(142:ID=6),
HIT=NEXT),
IFTHEN=(WHEN=GROUP,
BEGIN=(20,7,CH,EQ,C'J E S 2'),
PUSH=(149:SEQ=6))
这会产生以下输出:
000952 000001 000952
000953 000001 000953
000954 000001 000954
000955 000001 000955
000956 000001 000956
000957 000001 000957
000958 000001 000958
000959 000001 000959
000960 000002 000001 <-- New job starts here
000961 000002 000002
000962 000002 000003
000963 000002 000004
000964 000002 000005
000965 000002 000006
000966 000002 000007
000967 000002 000008
000968 000002 000009
000969 000002 000010
000970 000002 000011
000971 000002 000012
000972 000002 000013
我的下一份工作是让工作中的最高记录数达到顶峰。我能够通过按降序对第二个排序输入进行排序来完成此操作,请参见下文。 我还添加了一个新行(在第 157 位)来推送最高记录数,以便我以后可以使用它。
SORT FIELDS=(142,6,ZD,A,135,6,ZD,D)
OUTREC IFTHEN=(WHEN=GROUP,
END=(20,7,CH,EQ,C'J E S 2'),
PUSH=(157:149,6))
上述步骤提供了以下输出(按第二列排序,然后是第一列)
000959 000001 000959 000959
000958 000001 000958 000959
000957 000001 000957 000959
000956 000001 000956 000959
000955 000001 000955 000959
...
000007 000001 000007 000959
000006 000001 000006 000959
000005 000001 000005 000959
000004 000001 000004 000959
000003 000001 000003 000959
000002 000001 000002 000959
000001 000001 000001 000959
001976 000002 001017 001017 <--- Next job starts, highest row count is 1017
001975 000002 001016 001017
001974 000002 001015 001017
001973 000002 001014 001017
001972 000002 001013 001017
001971 000002 001012 001017
001970 000002 001011 001017
001969 000002 001010 001017
001968 000002 001009 001017
001967 000002 001008 001017
001966 000002 001007 001017
在第四列中,我现在有作业中的总行数。剩下的就是恢复到原来的记录顺序。这是通过对相同的列进行排序来完成的,但是对第二个排序输入使用升序而不是降序。
SORT FIELDS=(142,6,ZD,A,135,6,ZD,A)
当回顾这个解决方案时,我在想办法太难了,导致我无法解决这个问题:)