在PDS中搜索字符串并使用JCL排除结果

时间:2014-01-30 17:51:08

标签: search jcl

我正在尝试执行以下操作:

1)在PDS中搜索字符串的成员。 2)用上面提到的字符串排除成员并获得成员列表。

我想使用JCL或任何其他大型机工具或实用程序来执行此操作。

感谢任何帮助。

3 个答案:

答案 0 :(得分:3)

我认为您正在寻找ISPF Search-For utility,也可能是executed in batch

您还可以在ISPF成员列表屏幕上使用SRCHFOR命令,然后按提示列排序,该列指示哪些成员匹配。

答案 1 :(得分:3)

这可能有更好的方法,但这对你有用。 复制以下JCL并替换:

    无论您的工作卡需要什么,
  • 您的工作车信息
  • pds-to-search ,其中包含您要搜索的PDS的名称
  • temp-pds-name ,其有效的PDS名称不会复制您已有的任何内容
  • string-to-search-for ,其中包含您要搜索PDS成员的字符串

不包含 string-to-search-for 的PDS成员列表将列在DD 列表下, 您可以在适当的地方重定向。

第一个作业步骤(SEARCH)调用ISPF SEARCHFOR实用程序,以识别包含该字符串的所有PDS成员。 第二步(LSTPDS)调用TSO LISTDS实用程序列出PDS的所有成员。第三步(REXXPGM)写了一点 REXX程序到临时PDS以便在下一步中使用。最后一步(LSTMBR)运行REXX过程以构建LISTING数据集 并删除沿途构建的临时文件。

如果一个人足够聪明,我认为ICETOOL可能会取代最后的两个步骤(但是到底是什么......实际上我确实找到了一个更好的过程,在此之后看到下一个JCL)

//LOOKFOR JOB your-job-card-info
//*====================================================================
//SEARCH  EXEC PGM=ISRSUPC,PARM=(SRCHCMP,'ANYC')
//NEWDD  DD DSN=pds-to-search,DISP=SHR
//OUTDD DD DSN=&&SRCH,DISP=(NEW,PASS,DELETE),
//            AVGREC=K,
//            SPACE=(133,(5,5)),
//            DCB=(LRECL=133,BLKSIZE=133,RECFM=FB)
//SYSIN  DD *
SRCHFOR  'string-to-search-for'
/*
//*====================================================================
//LSTPDS   EXEC PGM=IKJEFT01
//SYSTSPRT DD DSN=&&MBRS,DISP=(NEW,PASS,DELETE),
//            AVGREC=K,
//            SPACE=(80,(5,5)),
//            DCB=(LRECL=80,BLKSIZE=80,RECFM=FB)
//SYSTSIN  DD *
 LISTDS 'pds-to-search' MEMBERS
/*
//REXXPDS  EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
 ALLOCATE DSN('temp-pds-name') NEW KEEP -
          DSORG(PO) RECFM(F,B) LRECL(80) -
          AVGREC(U) SPACE(80,100) DIR(5) DSNTYPE(PDS)
/*
//*====================================================================
//REXXPGM  EXEC PGM=IDCAMS
//SYSPRINT DD SYSOUT=*
//SYSIN DD *
 REPRO INFILE(REXXPROG) OUTDATASET('temp-pds-name(MBRLIST)')
/*
//REXXPROG DD *
'EXECIO * DISKR SRCH(FINIS STEM X.'
FND = ''
DO I = 1 TO X.0
  IF WORD(X.I, 3) = 'STRING(S)' THEN FND = FND WORD(X.I, 1)
END
DROP X.
'EXECIO * DISKR MBRS(FINIS STEM X.'
MBRS = 0
DO I = 1 TO X.0 - 2
  IF MBRS & WORDPOS(WORD(X.I, 1), FND) = 0 THEN
     QUEUE WORD(X.I,1)
  ELSE
     IF X.I = '--MEMBERS--' THEN MBRS = 1 
END
'EXECIO * DISKW LISTING(FINIS'
RETURN
/*
//*====================================================================
//LISTMBR  EXEC PGM=IKJEFT01,PARM=('%MBRLIST')
//SYSEXEC  DD DSN=NXB123.JUNK,DISP=(OLD,DELETE,DELETE)
//SRCH     DD DSN=&&SRCH,DISP=(OLD,DELETE,DELETE)
//MBRS     DD DSN=&&MBRS,DISP=(OLD,DELETE,DELETE)
//LISTING  DD SYSOUT=A
//SYSTSPRT DD SYSOUT=A
//SYSTSIN  DD *
/*
//

这是一个更好的答案...... 只需要一段时间才能到达那里

//MYJOB JOB your-job-card-info
//SEARCH  EXEC PGM=ISRSUPC,PARM=(SRCHCMP,'LNFMTO')
//NEWDD  DD DSN=pds-to-search,DISP=SHR
//OUTDD DD DSN=&&SRCH,DISP=(NEW,PASS,DELETE),
//            AVGREC=K,
//            SPACE=(133,(5,5)),
//            DCB=(LRECL=133,BLKSIZE=133,RECFM=FB)
//SYSIN  DD *
 SRCHFOR  'string-to-search-for'
/*
//STEP02  EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTMSG DD SYSOUT=*
//SORTIN DD DSN=&&SRCH,DISP=(OLD,DELETE,DELETE)
//SORTOUT DD SYSOUT=*
//SYSIN DD *
 SORT FIELDS=COPY -
 INCLUDE COND=(30,6,CH,EQ,C'    0 ') -
 OUTREC  FIELDS=(1,8)
/*

关键是提供给ISRSUPC的LNFMTO参数。此参数告诉ISRSUPC仅列出其中的成员 找不到搜索字符串。究竟是什么要求。下一步就是 格式化上一步的结果。不包含搜索的成员列表 字符串列在SYSOUT中,可以根据需要重定向。

答案 2 :(得分:2)

另一种方法:将整个PDS以未排序的顺序“打”成“平面”文件;将JOINKEYS与使用SS编写的数据一起使用,用于子字符串,字段类型。

//PUNCHIT EXEC PGM=IEBPTPCH 
//SYSUT1 DD  DISP=SHR,DSN=your.pds 
//SYSUT2 DD  DSN=output.dataset,RECFM=FB,LRECL=81,otherstuffyouneed
//SYSPRINT DD SYSOUT=* 
//SYSIN DD * 
 PUNCH TYPORG=PO 
/*

之后,使用SORT:

的JOINKEYS步骤
//FINDMISS EXEC PGM=SORT 
//SYSOUT   DD SYSOUT=* 
//SORTOUT  DD SYSOUT=* 
//SYSIN    DD * 
  OPTION COPY 
  JOINKEYS F1=INA,FIELDS=(1,8,A) 
  JOINKEYS F2=INB,FIELDS=(82,8,A) 
  JOIN UNPAIRED,F1,ONLY 
/*                                                             
//JNF1CNTL DD * 
  INCLUDE COND=(2,13,CH,EQ,C'MEMBER NAME') 
  INREC BUILD=(15,8)
/* 
//JNF2CNTL DD * 
  INCLUDE COND=(2,13,CH,EQ,C'MEMBER NAME', 
             OR,2,72,SS,EQ,C'yoursearchvalue') 
  INREC IFTHEN=(WHEN=GROUP,BEGIN=(2,13,CH,EQ,C'MEMBER NAME'),
                    PUSH=(82:15,8)), 
        IFTHEN=(WHEN=(2,13,CH,EQ,C'MEMBER NAME'), 
                    OVERLAY=(82:8X)) 
/*
//INA DD DISP=SHR,DSN=YOUR.PUNCHED.FILE 
//INB DD DISP=SHR,DSN=YOUR.PUNCHED.FILE (yes, exactly the same one)

然后处理打孔文件,在同一步骤中读取它两次,并使用JOINKEYS将文件中的一个提取“匹配”到文件中的另一个提取。

在INA上通过JNF1CNTL提取所有成员名称。

在INB上通过JNF2CNTL,它提取所有成员名称,以及与所需搜索匹配的所有数据行。 IFTHEN =(WHEN = GROUP然后用于标记与它们所属的成员名称匹配的每个数据行,并且成员名称本身将被赋予空白成员名称。

JOINKEYS然后匹配成员名称键。来自INA通过JNF1CNTL的所有那些不匹配的是那些不包含搜索字符串的成员。这两个文件都需要排序,默认情况下会对每个JOINKEYS语句进行排序。

这适用于DFSORT。使用SyncSort,它将取决于您的安装是否支持JNFnCNTL文件(您必须尝试它,它没有记录)。如果您没有JNFnCNTL支持,则需要两个先前的单独步骤来提取数据。