使用 JCL 排序删除特定记录类型的重复项
Posted
技术标签:
【中文标题】使用 JCL 排序删除特定记录类型的重复项【英文标题】:Remove duplicates on specific record type using JCL sort 【发布时间】:2019-01-11 06:43:46 【问题描述】:您能帮我实现以下目标 JCL 排序吗? 如果记录不同,我有输入文件。我需要根据 10,04 位置仅删除重复的特定记录类型。其他类型的记录不应有任何变化。
我需要删除位置 10,4 上 P4 的重复项。
输入:
P1AAAAAAA0101xxxxxxx
P2AAAAAAA0101xxxxxxx
P4AAAAAAA0101xxxxxxx
P4AAAAAAA0101xxxxxxx
P4AAAAAAA0102xxxxxxx
P4AAAAAAA0103xxxxxxx
P4AAAAAAA0104xxxxxxx
P5AAAAAAA0101xxxxxxx
P7AAAAAAA0101xxxxxxx
P9AAAAAAA0101xxxxxxx
预期输出:
P1AAAAAAA0101xxxxxxx
P2AAAAAAA0101xxxxxxx
P4AAAAAAA0101xxxxxxx
P4AAAAAAA0102xxxxxxx
P4AAAAAAA0103xxxxxxx
P4AAAAAAA0104xxxxxxx
P5AAAAAAA0101xxxxxxx
P7AAAAAAA0101xxxxxxx
P9AAAAAAA0101xxxxxxx
【问题讨论】:
你试过什么???。您可以尝试谷歌搜索大型机排序删除重复项。随便看看 SUM FIELDS=NONE 亲爱的布鲁斯,我知道通用排序卡可以删除重复项,但我的要求不同。你能不能通过一次获得并建议。 您已使用 dfsort 和 syncsort 标记了您的问题,您使用的是哪种排序产品?另外,请向我们展示您的尝试,以免我们重复您的努力。 【参考方案1】:我想向您介绍一个小解决方案,虽然有点复杂但很有效,也许有人会有另一个比我更紧凑的解决方案:
//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)
问候, 安德烈亚斯
【讨论】:
【参考方案2】:给你。
//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 字节(序列号)。
请注意,P4 中重复记录的序列号将为 1。所以
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
希望这会有所帮助。
【讨论】:
以上是关于使用 JCL 排序删除特定记录类型的重复项的主要内容,如果未能解决你的问题,请参考以下文章