我有一个输入文件,该文件中的第三个字段是一个数字。该数字通常在同一字段中重复大约 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 的要求是在每 30 条记录后或当 POS 26,9 中的数字发生变化时在位置 1 打印一个“1”。
//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 中设置序列号。然后,当 26,9 中有新值时,它会重新启动 Seqnum。当 SEQNUM 的值为 30 时,我还需要重新启动序列号。但据我所知,重新启动仅在字段值更改时才有效。你不能对它使用逻辑表达式。
所以我的问题是,有没有人知道一种编写 SORT 的方法,它将读取一个顺序文件并在每 30 条记录之后或在某个字段中找到新值之后在位置 1 打印一个“1”。