需要用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 大小的构建)。