您能帮助我实现以下 JCL 排序目标吗? 我的输入文件具有不同的 set if 记录。我需要根据 10,04 位置仅删除特定记录类型的重复项。其他类型的记录不应有任何变化。
我需要删除位置 10,4 上 P4 的重复项。
输入:
P1AAAAAAA0101xxxxxxx
P2AAAAAAA0101xxxxxxx
P4AAAAAAA0101xxxxxxx
P4AAAAAAA0101xxxxxxx
P4AAAAAAA0102xxxxxxx
P4AAAAAAA0103xxxxxxx
P4AAAAAAA0104xxxxxxx
P5AAAAAAA0101xxxxxxx
P7AAAAAAA0101xxxxxxx
P9AAAAAA0101xxxxxxx
预期输出:
P1AAAAAAA0101xxxxxxx
P2AAAAAAA0101xxxxxxx
P4AAAAAAA0101xxxxxxx
P4AAAAAAA0102xxxxxxx
P4AAAAAAA0103xxxxxxx
P4AAAAAAA0104xxxxxxx
P5AAAAAAA0101xxxxxxx
P7AAAAAAA0101xxxxxxx
P9AAAAAA0101xxxxxxx
我想向您展示一个小解决方案,有点复杂,但它有效,也许有人会有另一个,比我的更紧凑:
//S1 EXEC PGM=ICETOOL
//TOOLMSG DD SYSOUT=*
//DFSMSG DD SYSOUT=*
//IN DD *
P1AAAAAAA0101xxxxxxx
P2AAAAAAA0101xxxxxxx
P4AAAAAAA0101xxxxxxx
P4AAAAAAA0101xxxxxxx
P4AAAAAAA0102xxxxxxx
P4AAAAAAA0103xxxxxxx
P4AAAAAAA0104xxxxxxx
P5AAAAAAA0101xxxxxxx
P7AAAAAAA0101xxxxxxx
P7AAAAAAA0101xxxxxxx
P9AAAAAAA0101xxxxxxx
//T1 DD DSN=&&T1,UNIT=SYSDA,SPACE=(CYL,(5,5)),DISP=(,PASS)
//T2 DD DSN=&&T2,UNIT=SYSDA,SPACE=(CYL,(5,5)),DISP=(,PASS)
//T3 DD DSN=&&T3,UNIT=SYSDA,SPACE=(CYL,(5,5)),DISP=(,PASS)
//OUT DD SYSOUT=*
//TOOLIN DD *
COPY FROM(IN) TO(T1) USING(AST1)
COPY FROM(IN) TO(T2) USING(AST2)
SELECT FROM(T1) TO(T3) ON(10,4,CH) NODUPS
MERGE FROM(T2,T3) TO(OUT) USING(AST3)
//AST1CNTL DD *
INCLUDE COND=(1,2,CH,EQ,C'P4')
//AST2CNTL DD *
INCLUDE COND=(1,2,CH,NE,C'P4')
//AST3CNTL DD *
MERGE FIELDS=(1,14,CH,A)
问候, 安德烈亚斯
给你。
//JOBNAME JOB 1,NOTIFY=&SYSUID
//STEP1 EXEC PGM=SORT
//SORTIN DD *
P1AAAAAAA0101XXXXXXX
P2AAAAAAA0101XXXXXXX
P4AAAAAAA0101XXXXXXX
P4AAAAAAA0101XXXXXXX
P4AAAAAAA0102XXXXXXX
P4AAAAAAA0103XXXXXXX
P4AAAAAAA0104XXXXXXX
P5AAAAAAA0101XXXXXXX
P7AAAAAAA0101XXXXXXX
P9AAAAAAA0101XXXXXXX
//SORTOUT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSIN DD *
INREC IFTHEN=(WHEN=INIT,BUILD=(1:1,20,21:SEQNUM,2,ZD)),
IFTHEN=(WHEN=(1,2,CH,EQ,C'P4'),OVERLAY=(21:C'01'))
SORT FIELDS=(1,2,CH,A,10,4,CH,A,21,2,CH,A)
SUM FIELDS=NONE
OUTREC FIELDS=(1:1,20)
INREC IFTHEN
在末尾设置序列号
记录。对于前 2 个字节的记录,序列号设置为 1
作为P4
。SORT FIELDS
语句中包含的控制字段是前2个
字节,第 10 列到 4 个字节和第 21 列到 2 个字节(序列号)。SUM FIELDS=NONE
将仅删除这些记录。输出:
P1AAAAAAA0101XXXXXXX
P1AAAAAAA0101XXXXXXX
P2AAAAAAA0101XXXXXXX
P4AAAAAAA0101XXXXXXX
P4AAAAAAA0102XXXXXXX
P4AAAAAAA0103XXXXXXX
P4AAAAAAA0104XXXXXXX
P5AAAAAAA0101XXXXXXX
P7AAAAAAA0101XXXXXXX
P9AAAAAAA0101XXXXXXX
让我们使用以下输入运行同一组 SORT 语句。请注意,前 2 条记录 (P1) 与 P4 是重复的。
//JOBNAME JOB 1,NOTIFY=&SYSUID
//STEP1 EXEC PGM=SORT
//SORTIN DD *
P1AAAAAAA0101XXXXXXX
P1AAAAAAA0101XXXXXXX
P2AAAAAAA0101XXXXXXX
P4AAAAAAA0101XXXXXXX
P4AAAAAAA0101XXXXXXX
P4AAAAAAA0102XXXXXXX
P4AAAAAAA0103XXXXXXX
P4AAAAAAA0104XXXXXXX
P5AAAAAAA0101XXXXXXX
P7AAAAAAA0101XXXXXXX
P9AAAAAAA0101XXXXXXX
//SORTOUT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//SYSIN DD *
INREC IFTHEN=(WHEN=INIT,BUILD=(1:1,20,21:SEQNUM,2,ZD)),
IFTHEN=(WHEN=(1,2,CH,EQ,C'P4'),OVERLAY=(21:C'01'))
SORT FIELDS=(1,2,CH,A,10,4,CH,A,21,2,CH,A)
SUM FIELDS=NONE
OUTREC FIELDS=(1:1,20)
运行作业后的输出如下所示。请注意,重复的 P1 记录将被保留,并且仅删除具有特定记录类型 (P4) 的重复记录。
P1AAAAAAA0101XXXXXXX
P1AAAAAAA0101XXXXXXX
P2AAAAAAA0101XXXXXXX
P4AAAAAAA0101XXXXXXX
P4AAAAAAA0102XXXXXXX
P4AAAAAAA0103XXXXXXX
P4AAAAAAA0104XXXXXXX
P5AAAAAAA0101XXXXXXX
P7AAAAAAA0101XXXXXXX
P9AAAAAAA0101XXXXXXX
希望这有帮助。