我有如下数据:
这不是实际数据,但实际数据与此类似。而且,数据以一个文件的形式出现,每个字段之间有两个空格。输入或输出不涉及数据库。我使用表格格式只是为了让它可以理解。
Name Number code
+---------------------+
Albert 122234 xcc
Robert 565435 rtd
Robert 776567 iuy
Robert 452890 yyt
Stuart 776565 ter在一个文件中,数据看起来像..。
Albert 122234 xcc
Robert 565435 rtd
Robert 776567 iuy
Robert 452890 yyt
Stuart 776565 ter现在,我需要使用SYNCSORT消除重复。我可以使用XSUM完成这一任务,但我将获得以下数据:
Name Number code
+---------------------+
Albert 122234 xcc
Robert 565435 rtd
Stuart 776565 ter但我需要:
Name Number code
+----------------------+
Albert 122234 xcc
Robert 452890 yyt
Stuart 776565 ter最后一组数据在输出中有最后一次出现Robert,而前一组有第一次出现。
那么,有什么方法可以用XSUM.来实现这一点吗?
发布于 2013-08-23 18:14:10
两个步骤,第一个步骤添加一个序列号,并按名称升序和降序排序。这是为了获得每个名字的最后一个记录。
第二步仅按名称与EQUALS参数进行排序,在排序字段中出现重复值的情况下,将数据保持在与输入文件相同的顺序。然后用SUM FIELDS=NONE消除重复项。
//SORT1 EXEC PGM=SORT
//SORTIN DD *
ALBERT 122234 XCC
ROBERT 565435 RTD
ROBERT 776567 IUY
ROBERT 452890 YYT
STUART 776565 TER
//SYSIN DD *
INREC FIELDS=(001:001,020, * REGULAR INPUT DATA
021:SEQNUM,4,BI) * ADD A SEQUENCE NUMBER
SORT FIELDS=(001,008,CH,A,
021,004,BI,D)
OUTREC FIELDS=(001:001,020, * ORIGINAL INPUT DATA
080:C' ') * PADDING
//SORTOUT DD DISP=(NEW,PASS),
// AVGREC=U,
// LRECL=80,
// RECFM=FB,
// SPACE=(80,(1000,100))
//SYSOUT DD SYSOUT=*
//*
//SORT2 EXEC PGM=SORT
//SORTIN DD DISP=(SHR,PASS),DSN=*.SORT1.SORTOUT
//SYSIN DD *
SORT FIELDS=(001,008,CH,A),EQUALS
SUM FIELDS=NONE
//SORTOUT DD SYSOUT=*
//SYSOUT DD SYSOUT=*
//*发布于 2013-08-24 12:19:10
有多种方法可以做到这一点。
首先,使用SyncTool (很可能将其“别名”为ICETOOL,这样您就有了PGM=ICETOOL )。看看SELECT操作符,它有LAST,它应该给您想要的东西。如果您的文件已经排序,不要再对其排序(在使用文件中选择复制)。
在此出版物中的“保持丢弃重复记录(XSUM)”下可以找到一个示例:ftp://ftp.software.ibm.com/storage/dfsort/mvs/sorttrck.pdf
您最终将得到一张控制卡,如下所示:
SELECT FROM(IN) TO(OUT) ON(1,3,CH) FIRST DISCARD(SORTXSUM)这里还有一个简单的例子:http://www.ibmmainframes.com/viewtopic.php?p=310008#310008
如果您的数据已经被排序,或者在数据被排序之后,请使用OUTFIL和“报告函数”。查看REMOVECC和NODETAIL,使用节和TRAILER3。这里,http://www.ibmmainframes.com/viewtopic.php?p=309955#309955,就是一个例子。
最后,您将按照以下方式获得控制卡:
OPTION EQUALS
SORT FIELDS=(1,3,CH,A)
OUTFIL REMOVECC,NODETAIL,SECTIONS=(1,3,TRAILER3=(1,80))如果要对数据进行排序,并希望使用XSUM在单独的dataset中保留离散副本,则可以在记录和排序的临时扩展中包含一个序列号,并在主键之后降序。放下临时分机。这不可能在一步之内完成,但是SELECT (当然是DFSORT版本)可以完成XSUM所做的所有事情,并且可以在一个函数中完成更多的操作。
最后,在我脑海中烦扰了一些事情之后,如果您当前的SyncSort至少为1.4,那么您完全可以使用DUPKEYS使用LASTDUP和XDUP,而不是SUM和XSUM来实现您想做的事情(但我们仍然不知道这是什么)。
您最终将得到一张控制卡,如下所示:
DUPKEYS LASTDUP,NODUPS,XDUP发布于 2013-08-27 07:55:57
看起来,您希望保留一组具有相同排序键的记录的最后一条记录。
如果您最近发布了一个SyncSort,那么在LASTDUP中使用DUPKEYS,并且等于其他答案中提到的那样。
我已经有一段时间没有使用SyncSort了,但是如果我没记错的话,就可以编写一个退出例程,它可以访问排序键,并且可以接受或拒绝记录。每个记录都会输入退出例程,因此可以保留先前的排序键以进行比较。
另外,我喜欢用汇编程序(BAL)编写出口,但这可以用COBOL代码来完成。
因此,如果SyncSort支持一个命令来满足您的需要,那么一定要使用它!如果没有,那么出口相对容易编码..。
https://stackoverflow.com/questions/18400186
复制相似问题