如何使用排序从输出文件 1 中的 F1 和 F2 中获取匹配记录,以及从输出文件 2 中的 F2 中获取不匹配记录

Posted

技术标签:

【中文标题】如何使用排序从输出文件 1 中的 F1 和 F2 中获取匹配记录,以及从输出文件 2 中的 F2 中获取不匹配记录【英文标题】:How to Get Matching records from both F1 & F2 in output file1 and Non-Matching Records from F2 in output File 2 using Sort 【发布时间】:2021-05-25 16:56:48 【问题描述】:

您好,我正在尝试从 2 个文件中查找匹配和不匹配的记录,一个文件是带有 181 LRECL 的错误文件,第二个文件 F2 是具有相同 181 LRECL 的有效记录文件。

示例错误文件

12345678901
11111111111
11111111111
22222222222

有效文件有

33333333333
11111111111
11111111111
44444444444

我实现了左外连接

//F1       -> ERROR FILE
//F2       -> VALID FILE
//SYSOUT   DD SYSOUT=*                                                       
//SYSIN    DD *                                                       
  JOINKEYS F1=MAIN,FIELDS=(43,11,A)                            
  JOINKEYS F2=LOOKUP,FIELDS=(10,11,A)                               
  JOIN UNPAIRED,F2 ONLY                                                
  SORT FIEDLS=COPY
/*   

           

所以使用它我能够获得 sysout 的错误文件中不存在的有效记录

系统输出:

33333333333
44444444444

但我不想丢失两个文件中的匹配记录,并希望将两个文件中的匹配记录写入第二个输出文件。

我尝试实现

FULL OUTER Join,但无法得到结果

//F1 -> Error File
//F2 -> Valid File
//MATCH    DD DSN=MYDATA.URMI.SAMPLE.MATCH,DISP=OLD
//NOMATCH1 DD DSN=MYDATA.URMI.SAMPLE.NOMATCH1,DISP=OLD
//NOMATCH2 DD DSN=MYDATA.URMI.SAMPLE.NOMATCH2,DISP=OLD 
//SYSOUT   DD SYSOUT=*                                                       
//SYSIN    DD *                                                       
  JOINKEYS F1=MAIN,FIELDS=(43,11,A)                            
  JOINKEYS F2=LOOKUP,FIELDS=(10,11,A)                               
  JOIN UNPAIRED,F1,F2                                                 
  REFORMAT FIELDS=(?,F1:1,181,F2:1,181)                                
  OPTION COPY                                                         
  OUTFIL FNAMES=MATCH,INCLUDE=(1,1,CH,EQ,C'B'),BUILD=(1:2,181)                                                
  OUTFIL FNAMES=NOMATCH1,INCLUDE=(1,1,CH,EQ,C'1'),BUILD=(1:2,181) 
  OUTFIL FNAMES=NOMATCH2,INCLUDE=(1,1,CH,EQ,C'2'),BUILD=(1:2,181) 
/*     

         

【问题讨论】:

好的,已删除,谢谢 【参考方案1】:

根据上面的快照,您首先重新格式化了 181 字节的错误文件,然后是 181 字节的 VALID 文件。因此,在编写 NOMATCH2 文件时,您应该构建为 BUILD=(1:183,181) 而不是 BUILD=(1:2,181)。希望这能解决您的问题,如果您仍然无法解决问题,请在此处更新。

问候, 暗部。

【讨论】:

您好 Anbu,感谢您的回复。我实施了上述解决方案,并且 NOMATCH2 & 1 文件似乎复制了正确的数据。再次感谢。【参考方案2】:

为了完整起见,我将发布更新后的脚本和生成的输出文件:

 JOINKEYS F1=MAIN,FIELDS=(43,11,A)
 JOINKEYS F2=LOOKUP,FIELDS=(10,11,A)
 JOIN UNPAIRED,F1,F2
 REFORMAT FIELDS=(?,F1:1,181,F2:1,181)
 OPTION COPY
 OUTFIL FNAMES=MATCH,INCLUDE=(1,1,CH,EQ,C'B'),BUILD=(1:2,181)
 OUTFIL FNAMES=NOMATCH1,INCLUDE=(1,1,CH,EQ,C'1'),BUILD=(1:2,181)
 OUTFIL FNAMES=NOMATCH2,INCLUDE=(1,1,CH,EQ,C'2'),BUILD=(1:183,181)

输出文件 MATCH 应包含:

11111111111
11111111111
11111111111
11111111111

输出文件 NOMATCH1 应包含:

12345678901
22222222222

输出文件 NOMATCH2 应包含:

33333333333
44444444444

这已使用 AHLSORT for Windows v14r3-117-ge2d0a249 进行了验证,但结果应该与 DFSORT for z/OS 相同。

【讨论】:

以上是关于如何使用排序从输出文件 1 中的 F1 和 F2 中获取匹配记录,以及从输出文件 2 中的 F2 中获取不匹配记录的主要内容,如果未能解决你的问题,请参考以下文章

在C语言中如何输出空格?

如何从 Rcpp 中的另一个函数调用一个函数?

JS问题JQUERY问题如何让一段函数执行完毕后再执行另一段函数

如何构建MIPS交叉编译工具链

f1score一般为多大

如何在 Oracle 的组中获得第三个 [重复]