我有一个ps文件,如果下面没有数据,我想删除标题,即。如果在两个连续的行中有标题(由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,我们可以这样做吗?
答案 0 :(得分:2)
有两种技术,JOINKEYS技术在很短的时间内更容易解释。
您使用JOINKEYS,两个输入文件的数据集名称。
您可以为两个输入定义JNFnCNTL数据集,并在每个输入中为每个记录附加序列号。一个(JNFCNTL1)序列号从零开始,另一个(JNFCNTL2)从一个开始。序列号必须足够大才能表达您的记录数。
JOINKEYS键可以在文件上创建序列号。
使用JOIN UNPAIRED,F2(可以获得匹配,在F2上无法匹配)。
F1重组:1,3:F2:1,80
OMIT with COND = for main task,在那里你摆脱了记录,其中1,3是HDR,1,3匹配4,3(前一个记录是标题)。
然后在主任务中使用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
在REFORMAT上:
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操作将包含三个"任务"同时运作。 "主要任务"是一个完全正常的SORT步骤,包括你想要的任何东西。
有两个子任务,每个子任务对应一个输入数据集。这些子任务中的每一个都可以具有提供的其他控制卡以修改其数据。这些是在JNFnCNTL DD上指定的。 JNF1CNTL和JNF2CNTL。根据实际要求,您可以不提供任何一个或两个。在这里你想要两个。
JNFnCNTL数据集必须只包含普通控制卡的子集。它们可能不包含OUTREC或OUTFIL。这是因为它们与主要任务完全在OUTREC可能存在的地方进行互操作。
在JOINKEYS语句中,指定SORTED,NOSEQCK。这是因为,默认情况下,JOINKEYS数据集被排序(在匹配的键上),并且序列已经得到保证(并且不需要检查),因为键的序列是序列号。
REFORMAT语句应仅包含主任务中所需的数据。这里所需要的只是HDR可能存在的位置,以及来自F2的完整记录。
JOIN UNPAIRED,F2将获得所有匹配的记录,以及所有不匹配的F2(最终记录只有一个,因为匹配在序列号上,偏移一个)。
要理解这一点(或任何进一步的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中的?(问号):两个文件中的B,仅适用于F2上的2(显示为1,因为JOIN语句仅询问匹配和无与伦比的F2)。