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

Find the line number of particular record using JCL

我有一个输入PS文件喜欢
aaa1111zzzz
bbb2222bbbb
ccc3333bbbb
ddd3333cccc
eee7777yyyy

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

我正在寻找可以做到这一点的 JCL,我在网上搜索过,但没有成功。

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

现在,针对您的任务,cschneid 已为您指明了一种解决方案。您将必须操纵来自 superc 的报告才能在发布时获取它。 或者,您可以按如下方式使用您的排序产品: 在读取记录时,您要求 sort 为每条记录分配一个序列号。写出记录时,您要求排序仅引用具有您要查找的值的记录,并且只写出这些记录的序列号。

关于 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)
/*                                                             

这与大多数人采用的方法不同,但不要忘记您实际上可以使用 z/OS UNIX 服务实用程序来完成此类任务。在您的示例中,"grep -nr pattern file" 会找到所有匹配 "pattern" 的行并显示行号。

当然,当您的数据位于常规数据集中时,诀窍是让 "file" 部分正确......有时,最简单的是这样的:

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