从 ps 文件中删除多个 header

Remove multiple header from ps file

我有一个 ps 文件,如果下面没有数据,我想删除 header,即 .如果在连续两行中有 headers(由 FIRST 3 字母 HDR 识别),我想删除第一个,因为没有数据。

输入数据

HDR20170123
HDR20170124
1.8988 ABCD
1.4324 PARE
HDR20170125
1.5432 URST

期望的输出

HDR20170124
1.8988 ABCD
1.4324 PARE
HDR20170125
1.5432 URST

有没有办法使用 dfsort ,我们可以这样做吗?

有两种技术,JOINKEYS 技术更容易在短时间内解释 space。

您使用 JOINKEYS,您的数据集名称用于两个 个输入文件。

您为两个输入定义了 JNFnCNTL 数据集,并在每个输入中为每条记录附加了一个序列号。一个 (JNFCNTL1) 序列号从零开始,另一个 (JNFCNTL2) 从一个开始。序列号需要足够大以表达您的记录数。

您在文件上 sequence-numbers 创建的 JOINKEYS 键。

使用 JOIN UNPAIRED,F2(这会让你匹配,在 F2 上不匹配)。

重新格式化 F1:1,3:F2:1,80

OMIT with COND= 用于主要任务,在其中删除 1,3 是 HDR 且 1,3 匹配 4,3 的记录(之前的记录是 header)。

然后在主任务中BUILD=(4,80),去掉之前记录的前三个字节。

在输入中,您的数据将如下所示,偏移量表示序列号:

     F1          F2
HDR20170123 
HDR20170124 HDR20170123
1.8988 ABCD HDR20170124
1.4324 PARE 1.8988 ABCD
HDR20170125 1.4324 PARE
1.5432 URST HDR20170125
            1.5432 URST

关于重新格式化:

HDR 
HDRHDR20170123
1.8HDR20170124
1.41.8988 ABCD
HDR1.4324 PARE
1.5HDR20170125
   1.5432 URST

然后您获得的是先前记录的数据可用性(前三个字节,根据给定情况的需要),同时您拥有当前记录,因此测试先前记录的值很容易.

现在是时候编写一些代码了:

//SYSIN    DD * 
  OPTION COPY 
  JOINKEYS F1=INA,FIELDS=(81,6,A),SORTED,NOSEQCK
  JOINKEYS F2=INB,FIELDS=(81,6,A),SORTED,NOSEQCK
  JOIN UNPAIRED,F2 
  REFORMAT FIELDS=(F1:1,3, 
                  F2:1,80) 
  OMIT COND=(1,3,CH,EQ,C'HDR', 
            AND, 
             1,3,CH,EQ,4,3,CH) 
  INREC BUILD=(4,80) 
//JNF1CNTL DD * 
  INREC  OVERLAY=(81:SEQNUM,6,ZD, 
                     START=0) 
//JNF2CNTL DD * 
  INREC  OVERLAY=(81:SEQNUM,6,ZD, 
                     START=1) 
//INA      DD * 
HDR20170123 
HDR20170124 
1.8988 ABCD 
1.4324 PARE 
HDR20170125 
1.5432 URST 
//INB      DD * 
HDR20170123 
HDR20170124 
1.8988 ABCD 
1.4324 PARE 
HDR20170125 
1.5432 URST 

这会产生您想要的输出:

HDR20170124
1.8988 ABCD
1.4324 PARE
HDR20170125
1.5432 URST

一个 JOINKEYS 操作将由三个 "tasks" 同时操作组成。 "main task" 是一个完全正常的 SORT 步骤,由您想要的任何内容组成。

有两个sub-tasks,每个输入数据集一个。 sub-tasks 中的每一个都可以提供更多的控制卡来修改它们的数据。这些在 JNFnCNTL DD 上指定。 JNF1CNTL 和 JNF2CNTL。您可以根据实际需要提供none,其中一个或两个。这两个你都想要。

JNFnCNTL 数据集必须只包含正常控制卡的子集。它们可能不包含 OUTREC 或 OUTFIL。这是因为它们 inter-operate 与主要任务恰好在 OUTREC 可能存在的位置。

在 JOINKEYS 语句中,指定 SORTED,NOSEQCK。这是因为,默认情况下,JOINKEYS数据集是排序的(在匹配的key上),并且已经保证了顺序(不需要检查),因为key的顺序是一个序号

REFORMAT 语句应仅包含主任务中所需的数据。这里只需要HDR可能存在的位置,以及F2的完整记录。

JOIN UNPAIRED,F2会得到所有匹配的记录,以及所有不匹配的F2(只会有一个,最后的记录,因为匹配在序号上,偏移1)。

为了理解这一点(或进一步的任何 DSFORT 数据操作)进行修改以在中间阶段显示数据。这里只有一个阶段,所以很简单:

//SYSIN    DD * 
  OPTION COPY 
  JOINKEYS F1=INA,FIELDS=(81,6,A),SORTED,NOSEQCK
  JOINKEYS F2=INB,FIELDS=(81,6,A),SORTED,NOSEQCK
  JOIN UNPAIRED,F2 
  REFORMAT FIELDS=(F1:1,12,81,6,12,1, 
                   F2:1,12,81,6,12,1, 
                   ?) 
//JNF1CNTL DD * 
  INREC  OVERLAY=(81:SEQNUM,6,ZD, 
                     START=0) 
//JNF2CNTL DD * 
  INREC  OVERLAY=(81:SEQNUM,6,ZD, 
                     START=1) 
//INA      DD * 
HDR20170123 
HDR20170124 
1.8988 ABCD 
1.4324 PARE 
HDR20170125 
1.5432 URST 
//INB      DD * 
HDR20170123 
HDR20170124 
1.8988 ABCD 
1.4324 PARE 
HDR20170125 
1.5432 URST 

产生这个输出:

HDR20170124 000001 HDR20170123 000001 B
1.8988 ABCD 000002 HDR20170124 000002 B
1.4324 PARE 000003 1.8988 ABCD 000003 B
HDR20170125 000004 1.4324 PARE 000004 B
1.5432 URST 000005 HDR20170125 000005 B
                   1.5432 URST 000006 2

因为你在一个80字节的数据中只显示了11个字节的数据,所以在这个REFORMAT语句中取前12个位置(第12个留空)并且12,1也用作分隔符(文字不能在 REFORMAT 中使用)。还显示了相应的序列号,REFORMAT 中的内置 match-marker(?(question-mark):B 表示两个文件,2 表示仅 F2(不显示 1,因为 JOIN语句只要求匹配和不匹配的 F2)。