将包含特定字符串的整行替换为PS文件中的另一个字符串

时间:2014-04-22 18:47:28

标签: sorting file-io mainframe jcl

输入文件包含带增量编号的.SYNC:-.sync从位置1开始

 ----+----1----+----2----+----3---                           
 .SYNC 175                         
 UPDATE DB2DF36.RF_PROC_RATES     
 .SYNC 180                         
 UPDATE DB2DF36.RF_PROC_RATES     
 .SYNC 185                         
 UPDATE DB2DF36.RF_PROC_RATES     
 .SYNC 190                         
 UPDATE DB2DF36.RF_PROC_RATES     
 .SYNC 195                         
 UPDATE DB2DF36.RF_PROC_RATES

需要以这样的方式应用X all .sync或jcl sort,它用COMMIT替换整个.SYNC行;

输出:

 COMMIT;
 UPDATE DB2DF36.RF_PROC_RATES     
 COMMIT;                         
 UPDATE DB2DF36.RF_PROC_RATES     
 COMMIT;                         
 UPDATE DB2DF36.RF_PROC_RATES     
 COMMIT;                         
 UPDATE DB2DF36.RF_PROC_RATES     
 COMMIT;                        
 UPDATE DB2DF36.RF_PROC_RATES

2 个答案:

答案 0 :(得分:4)

为什么不尝试一个简单的REXX程序。类似的东西:

/* REXX */
'EXECIO * DISKR INDD(FINIS'  /* Input dataset */
DO QUEUED()
   PARSE PULL TXT
   IF WORD(TXT, 1) = 'UPDATE' THEN DO
      QUEUE 'COMMIT;'
      QUEUE TXT
      END
   END
'EXECIO' QUEUED() 'DISKW OUTDD(FINIS' /* Output dataset */
EXIT

将上述程序保存在PDS中(例如USERID.MYREXX.EXEC(MYPROC)),然后将其作为工作的一部分运行。 JCL来 运行REXX程序是:

//TSOBATCH  EXEC PGM=IKJEFT01
//SYSEXEC   DD   DSN=USERID.MYREXX.EXEC,DISP=SHR
//INDD      DD   DSN=DATASET.TO.READ,DISP=SHR
//OUTDD     DD   DSN=DATASET.TO.WRITE,DISP=NEW...
//SYSTSPRT  DD   SYSOUT=A
//SYSTSIN   DD   *
 %MYPROC
/*
//

上述过程将分配给INDD的数据集读入其内部数据队列。 然后它一次拉入一条记录(PARSE PULL TXT)。如果该行开头 “word”UPDATE然后推出两行,一个COMMIT;它紧随其后 读。最后,它将排队的记录写回新的输出数据集。

如果输入行上的第一个单词不是UPDATE,那么它只是忽略该行 并继续下一个。

答案 1 :(得分:3)

 OPTION COPY
 INREC IFTHEN=(WHEN=(1,5,CH,EQ,C'.SYNC'),
               OVERLAY=(C'COMMIT;',10X))

测试值,使用OVERLAY覆盖值的顶部。

您可以修改10X,我不知道您的序列号有多长。

BUILD=(C'COMMIT;',80X))可以替换OVERLAY,假设记录长度为80.使用CPU的时间稍微多一些,但是这是一种懒惰的方式来完成它。

从重新阅读你的问题看来,你可能也想用ISPF编辑器做这件事。

如果您的所有序列号都是三位数,则可以一次性完成:

c(hange) 1 p"$sync ###" "commit;"

这将更改的查找部分的位置限制为第1列,使用图片字符串,其中显示“特殊字符,字母”同步“(将遵循CAPS设置),一个空格和三个数字”将改为“提交”; (再次尊重CAPS的设定)。您必须注意;不是您的命令分隔符,如果是,则在主面板上的选项0上更改它。

如果您的序列号也更长/更短,我认为不能一次性完成。

为了安全起见,当然,您可以排除所有行,f(查找).sync(从第1列开始),然后c(hange) p"#" " " all nx然后将.sync更改为提交,记住all nx

如果使用命令分隔符(;除外),则可以在一行中完成所有操作(如果有空格)。

如果你腌制它,有UNDO,如果你已经启用它。

在@ NealB的回答中有一个非常有用的东西。这是一个人们经常难以掌握的概念。

SOME STUFF
SOME OTHER STUFF
SOME STUFF
DIFFERENT STUFF
SOME STUFF
YET MORE DIFFERENT STUFF

要求是“所有出现的SOME STUFF应更改为BANANAS”。

有用的东西是“抛弃我们迄今为止但不想要的东西,并将新的东西放在原处”。

另一个例子是:https://stackoverflow.com/a/14607610/1927206

要求将空白行从文件开头移到文件末尾。

这可以通过“删除文件开头的空行并在文件末尾添加空行”来实现。 “噢。我做不到。我需要数据,我只是不想要那里......”。有些人很难理解记录在记录中的“STUFF”与程序中的字面“STUFF”完全相同。

所以,这是这种情况的实现:

 OPTION COPY
 OMIT COND=(1,5,CH,EQ,C'.SYNC') oh my goodness, there goes my data!
 OUTFIL BUILD=(C'COMMIT;',80:X,
               /,
               1,80)

Slash运算符/仅在OUTFIL中的BUILD上可用(请不要在OUTFIL中使用OUTREC,对所有新代码使用BUILD)并在每次使用时生成新记录

与NealB一样,这假定数据是成对的记录。它抛弃了对中的第一个,然后在输出第二个之前再创新一对。

这通常是简化处理的好方法。这里没有这样的好处,但是自从这项技术出现以后......