SORT:
JOINKEYS FILES=F1,FIELDS=(5,4,A,10,20,A)
JOINKEYS FILES=F2,FIELDS=(1,4,A,6,20,A)
REFORMAT FIELDS=(F1:10,20,9,1,5,4,30,1,31,10,F2:27,10)
JOIN UNPAIRED,F1
INREC BUILD=(1,36,C',',37,10,C',',27,10,SFF,SUB,37,10,SFF,
EDIT=(TTTTTT))
输出是:*第二行第四列是与第二个文件不成对的空格,需要自动为0s。
22680372 ,5102, 1, 1,000000
22222222 ,5105, 2, ,000002
OUTPUT必须为:*第二行第四列为0或0000s,因为与第二个文件不成对,需要自动为0s。
22680372 ,5102, 1, 1,000000
22222222 ,5105, 2, 0,000002
您需要一个条件,即IFTHEN。你不能在同一个INREC上有IFTHEN和BUILD,但你可以有多个IFTHEN,BUILD可以是IFTHEN的一部分。
IFTHEN=(WHEN=INIT表示应该对每个记录执行的操作(无条件)。
IFTHEN=(WHEN=)只有当条件为true时,才会执行逻辑表达式。
每个BUILD语句都会生成一个完整的新中间记录(介于输入和输出之间)。OVERLAY只影响指定位置的数据(假设没有记录的扩展名)。
您的条件是记录的第46个字节是空格。您已经使用了SFF(您是否尝试过其他建议,尤其是FS?),因此没有必要在编译前将值设置为零。
JOINKEYS FILES=F1,FIELDS=(5,4,A,10,20,A)
JOINKEYS FILES=F2,FIELDS=(1,4,A,6,20,A)
REFORMAT FIELDS=(F1:10,20,9,1,5,4,30,1,31,10,F2:27,10)
JOIN UNPAIRED,F1
INREC IFTHEN=(WHEN=INIT,
BUILD=(1,36,
C',',
37,10,
C',',
27,10,SFF,
SUB,
37,10,SFF,
EDIT=(TTTTTT))),
IFTHEN=(WHEN=(47,1,CH,EQ,C' '),
OVERLAY=(46:C'0'))
我并不是为了好玩而格式化这样的语句,而是为了让它们更容易理解和维护。
好吧,这个解决方案有点笨拙。您可以将INREC替换为,对于这种类型的数据,它显示了EDIT:的替代方案
INREC IFTHEN=(WHEN=INIT,
BUILD=(1,36,
C',',
37,10,FS,TO=FS,LENGTH=10,
C',',
27,10,FS,
SUB,
37,10,FS,
TO=FS,LENGTH=8))
这要自然得多,因为空格变成了零,前导空格完全没有条件,并且只引用REFORMAT记录中该字段的位置。