z/OS Syncsort:省略不排序的重复项

Posted

技术标签:

【中文标题】z/OS Syncsort:省略不排序的重复项【英文标题】:z/OS Syncsort: omit duplicates without sort 【发布时间】:2017-11-29 12:10:57 【问题描述】:

无法通过手册了解如何使用 syncsort 管理此问题(我们找到了 dfsort 的解决方案,但没有帮助)。 由于程序错误(无法及时修复,您知道:程序员、测试、质量检查、部署......)我们在一个文件 (FB/LRECL 250) 中得到了重复记录,然后

存在标题行 后续重复的数据行必须省略,但唯一的一行 数据行不得排序(由于某些记录的强制逻辑关系) 尾部包含数据行数。

由于文件大小(>2 条 mio 记录),无法手动编辑该文件。

示例文件:

HEADER xxxx
cccc
bbbb 123
bbbb 123
bbbb 123
dddd
aaaa 123
aaaa 123
aaaa
TRAILER COUNT: 8

预期输出:

HEADER xxxx
cccc
bbbb 123         
dddd
aaaa 123
aaaa
TRAILER COUNT: 5

所以outfile根本没有排序,省略的记录

bbbb 123         (omitted)
bbbb 123         (omitted)
aaaa 123         (omitted)

根本不需要,可以直接进入涅槃。

(我什至会对省略页眉/拖车的解决方案感到满意,因为我可以在后续作业中轻松连接手动生成的行。)

感谢您的帮助!

【问题讨论】:

【参考方案1】:

我能够使用两个 SYNCSORT 步骤实现您的预​​期结果。

第 1 步:

INREC FIELDS=(1:SEQNUM,4,ZD,5:1,8)
SORT FIELDS=(5,8,CH,A),SKIPREC=1  
SUM FIELDS=NONE

使用 INREC,我在前 4 个字节中附加了序列号,然后是实际数据记录。然后,我以前 8 个字节为键对文件进行了排序。正在使用 SKIPREC 跳过标头记录。

第 2 步:

SORT FIELDS=(1,4,CH,A)                                              
OUTFIL FNAMES=SORTOF01,REMOVECC,                                    
OUTREC=(1:5,8,80:X),TRAILER1=('TRAILER COUNT:',COUNT=(M11,LENGTH=8))

在第 2 步中,将第 1 步的输出文件作为输入读取。正如您所期望的那样,数据行不会被排序,我已经以序列号作为键对输入进行了排序。使用 OUTREC,我会限制在最终输出文件中写入序列号。我最后使用 TRAILER1 打印记录数。

希望这会有所帮助。如果您有更有效的替代方法,请告诉我。

【讨论】:

【参考方案2】:

请参阅下面的分类卡。它是为您上面显示的示例数据而构建的。

//SORTOUT DD SYSOUT=*                                                 
//SYSIN DD *                                                          
 OPTION COPY                                                          
 INREC FIELDS=(1,50,SEQNUM,7,ZD,RESTART=(1,8))                        
 OUTFIL REMOVECC,OMIT=(51,7,ZD,GT,01,|,1,7,CH,EQ,C'TRAILER'),         
        OUTREC=(1,50),TRAILER1=(C'TRAILER COUNT:',COUNT-1=(M11,LENGTH=8))
/*             

【讨论】:

以上是关于z/OS Syncsort:省略不排序的重复项的主要内容,如果未能解决你的问题,请参考以下文章

Syncsort Sum Fields=None 不删除重复项

按组限制而不省略重复项?

Pandas HDFStore:省略重复项

使用 JCL 排序删除特定记录类型的重复项

删除排序数组中的重复项

26. 删除排序数组中的重复项