使用JCL查找特定记录的行号

时间:2018-01-19 17:41:35

标签: mainframe jcl

我有一个输入PS文件,如
aaa1111zzzz
bbb2222bbbb
ccc3333bbbb
ddd3333cccc
eee7777yyyy

我想知道此输入PS文件中存在单词“3333”的行号。输出应该类似
3
4
在这种情况下

我正在寻找能够做到这一点的JCL,我已经在网上搜索过,但没有运气。

3 个答案:

答案 0 :(得分:4)

你似乎误解了JCL是什么。 JCL不可执行,它不查看数据,也不操纵数据。 JCL就像是一个从你到操作系统的备忘录,要求操作系统运行一些程序。 当读取JCL时,操作系统读取它并设置执行JCL中定义的任务所需的任何内容,然后将JCL丢弃,即将其写入输出假脱机。 然后,操作系统根据已提取的信息运行程序。

现在,为了您的任务,cschneid已经为您指出了一个解决方案。您将不得不操纵superc的报告,以便在发布时获取它。 或者,您可以按如下方式使用排序产品: 在阅读您的记录时,请排序为每条记录分配一个序列号。在写出记录时,要求排序只引用具有您要查找的值的记录,并仅写出这些记录的序列号。

答案 1 :(得分:2)

关于NicC的回答,我尝试过使用SORT来达到预期的效果。

//SORT     EXEC PGM=SYNCSORT                                   
//SORTIN   DD *                                                
aaa1111zzzz                                                    
bbb2222bbbb                                                    
ccc3333bbbb                                                    
ddd3333cccc                                                    
eee7777yyyy                                                    
//SORTOUT  DD SYSOUT=*                                         
//SYSOUT   DD SYSOUT=*                                         
//SYSUDUMP DD SYSOUT=*                                         
//SYSIN DD *                                                   
  INREC FIELDS=(1:SEQNUM,3,ZD,4:1,11)                          
  SORT FIELDS=COPY                                             
  OUTFIL FNAMES=SORTOUT,INCLUDE=(7,4,ZD,EQ,3333),OUTREC=(1:1,3)
/*                                                             

答案 2 :(得分:0)

这是一种与大多数人不同的方法,但不要忘记您实际上可以将z / OS UNIX服务实用程序用于此类任务。在您的示例中,“grep -nr pattern file”将找到与“pattern”匹配的所有行,并显示行号。

当然,当你的数据在传统的数据集中时,诀窍就是让“文件”部分正确......有时,最简单的就是这样:

cat "//'my.dataset.name'" | grep -nr pattern 

要在JCL中运行它,你可以使用JCL将上面的命令作为输入放入BPXBATCH中,如下所示:

//jobname  JOB  ...
//         EXEC PGM=BPXBATCH
//STDERR   DD   PATH='/tmp/mystd.err',
//              PATHOPTS=(OWRONLY,OCREAT,OTRUNC),PATHMODE=SIRWXU
//STDOUT   DD   PATH='/tmp/mystd.out',
//              PATHOPTS=(OWRONLY,OCREAT,OTRUNC),PATHMODE=SIRWXU
//STDPARM  DD   *
    SH cat "//'my.dataset.name'" | grep -nr pattern 

如果你想在其他地方使用STDOUT / STDERR(例如,SYSOUT),只需更改STDERR / STDOUT DD语句即可。

如果您已经熟悉UNIX / Linux shell命令,那么以这种方式使用UNIX服务是非常酷的...请在此处阅读详细信息:https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.1.0/com.ibm.zos.v2r1.bpxa400/toc.htm