需要用JCL SORT比较不同记录中的相同字段
Need to compare the same field in different records with JCL SORT
我有一个输入文件,这个文件的第三个字段是一个数字。这个数字通常在同一个字段中重复大约 30-40 条记录,当读取的记录在此字段中具有不同的值时,我需要数字“1”打印在以下记录的第一个位置。例如
7226184019519 317786762 0000000000001POP160
7226184019522 317786762 0000000000001POP160
1 7226139045234 326446460 0000000000001POP160
7226139045242 326446460 0000000000001POP160
7226139045274 326446460 0000000000001POP160
7226139045277 326446460 0000000000001POP160
7226139045280 326446460 0000000000001POP160
我试过使用 'SECTIONS' 比如:
SORT FIELDS=COPY
OUTFIL FNAMES=SORTOUT,
SECTIONS=(26,9,HEADER3= (1:'1'))
但这会在单独的一行上打印数字“1”:
7226184019519 317786762 0000000000001POP160
7226184019522 317786762 0000000000001POP160
1
7226139045234 326446460 0000000000001POP160
7226139045242 326446460 0000000000001POP160
7226139045274 326446460 0000000000001POP160
7226139045277 326446460 0000000000001POP160
7226139045280 326446460 0000000000001POP160
我需要叠加层之类的东西,但我不确定如何将它与 'SECTIONS' 一起使用。
注意:上面的数字,317786762从第26位开始。
修正案
我已经想出如何将 1 移动到第一个位置(下面的代码)。完成此 SORT 的要求是在位置 1 打印“1”
每 30 条记录后或 POS 26,9 中的数字发生变化时。
//SYSIN DD *
SORT FIELDS=COPY
INREC IFTHEN=(WHEN=INIT,OVERLAY=(101:SEQNUM,8,ZD,
RESTART=(26,9))),
IFTHEN=(WHEN=(101,8,ZD,EQ,30),
OVERLAY=(1:C'1'))
/*
此代码在 POS 101,8 中设置序列号。然后它重新启动 Seqnum
当 26,9 中有新值时。我还需要序列号才能重新启动
当 SEQNUM 的值为 30 时。但据我所知,只有当字段的值发生变化时,Restart 才有效。你不能对它使用逻辑表达式。
所以我的问题是,
有谁知道一种编写 SORT 的方法,该方法将读取顺序文件并在每 30 条记录后或在某个字段中找到新值后在位置 1 打印“1”。
WHEN=GROUP 有帮助吗?或者也许是 TRAILERn?
我猜你的记录是定长的。
将 INREC 与 IFTHEN=(WHEN=INIT... 一起使用以临时扩展记录以包含序列号。序列号需要足够大以涵盖组中可能存在的最大记录数 (并使其成为 10 的幂)。在您的序列号上使用 RESTART=,并在那里指定您的关键字段。
然后,就像在您最近的另一个问题中一样,使用 IFTHEN=(WHEN=(逻辑表达式来标识组中的第一个(序列是一个)并在第一列使用 OVERLAY C'1'。
将 IFOUTLEN= 与原始记录长度一起使用,以 return 将记录恢复为原始大小。 IFOUTLEN 表示 "after the completion of IFTHEN processing, set the record-length to this"。省去了您必须执行 BUILD 才能删除临时扩展名的操作。
对于可变长度记录,过程略有不同(在第一个数据位置 5 处扩展,并且必须具有 return 大小的构建)。
我有一个输入文件,这个文件的第三个字段是一个数字。这个数字通常在同一个字段中重复大约 30-40 条记录,当读取的记录在此字段中具有不同的值时,我需要数字“1”打印在以下记录的第一个位置。例如
7226184019519 317786762 0000000000001POP160
7226184019522 317786762 0000000000001POP160
1 7226139045234 326446460 0000000000001POP160
7226139045242 326446460 0000000000001POP160
7226139045274 326446460 0000000000001POP160
7226139045277 326446460 0000000000001POP160
7226139045280 326446460 0000000000001POP160
我试过使用 'SECTIONS' 比如:
SORT FIELDS=COPY
OUTFIL FNAMES=SORTOUT,
SECTIONS=(26,9,HEADER3= (1:'1'))
但这会在单独的一行上打印数字“1”:
7226184019519 317786762 0000000000001POP160
7226184019522 317786762 0000000000001POP160
1
7226139045234 326446460 0000000000001POP160
7226139045242 326446460 0000000000001POP160
7226139045274 326446460 0000000000001POP160
7226139045277 326446460 0000000000001POP160
7226139045280 326446460 0000000000001POP160
我需要叠加层之类的东西,但我不确定如何将它与 'SECTIONS' 一起使用。
注意:上面的数字,317786762从第26位开始。
修正案
我已经想出如何将 1 移动到第一个位置(下面的代码)。完成此 SORT 的要求是在位置 1 打印“1” 每 30 条记录后或 POS 26,9 中的数字发生变化时。
//SYSIN DD *
SORT FIELDS=COPY
INREC IFTHEN=(WHEN=INIT,OVERLAY=(101:SEQNUM,8,ZD,
RESTART=(26,9))),
IFTHEN=(WHEN=(101,8,ZD,EQ,30),
OVERLAY=(1:C'1'))
/*
此代码在 POS 101,8 中设置序列号。然后它重新启动 Seqnum 当 26,9 中有新值时。我还需要序列号才能重新启动 当 SEQNUM 的值为 30 时。但据我所知,只有当字段的值发生变化时,Restart 才有效。你不能对它使用逻辑表达式。
所以我的问题是, 有谁知道一种编写 SORT 的方法,该方法将读取顺序文件并在每 30 条记录后或在某个字段中找到新值后在位置 1 打印“1”。
WHEN=GROUP 有帮助吗?或者也许是 TRAILERn?
我猜你的记录是定长的。
将 INREC 与 IFTHEN=(WHEN=INIT... 一起使用以临时扩展记录以包含序列号。序列号需要足够大以涵盖组中可能存在的最大记录数 (并使其成为 10 的幂)。在您的序列号上使用 RESTART=,并在那里指定您的关键字段。
然后,就像在您最近的另一个问题中一样,使用 IFTHEN=(WHEN=(逻辑表达式来标识组中的第一个(序列是一个)并在第一列使用 OVERLAY C'1'。
将 IFOUTLEN= 与原始记录长度一起使用,以 return 将记录恢复为原始大小。 IFOUTLEN 表示 "after the completion of IFTHEN processing, set the record-length to this"。省去了您必须执行 BUILD 才能删除临时扩展名的操作。
对于可变长度记录,过程略有不同(在第一个数据位置 5 处扩展,并且必须具有 return 大小的构建)。