将Mainframe SORT转换为Shell脚本

时间:2015-08-04 09:40:58

标签: shell mainframe

有没有简单的方法可以将JCL SORT转换为Shell脚本?

这是JCL SORT:

OPTION ZDPRINT
SORT FIELDS=(15,1,CH,A)
SUM FIELDS=(16,8,25,8,34,8,43,8,52,8,61,8),FORMAT=ZD
OUTREC BUILD=(14X,15,54,13X)

只有长度为54的字节15与输入数据相关,输入数据是求和的关键值和源值。来自输入的其他字节并不重要。

假设数据是可打印的。

数据在单字节密钥上排序,并且对于六个数字中的每一个,分别对具有相同密钥的记录的每个值求和。每个键写入一条记录,其中包含总和值以及第一个记录中的其他数据(介于两者之间和末尾的一个字节)。排序是"不稳定" (意味着提供给求和的记录顺序不能从一次执行到下一次执行),因此理论上所有记录的字节值应相同,或者无关紧要。

每个键的输出显示为包含14个空格(14X)的记录,然后是从位置15开始的54个字节(这是一个字节的键),然后是13个空白(13X)。数字应该是右对齐和左零填充[OP确认,并修改样本数据和预期输出]。

假设总和只包含正数并且不会被签名,并且对于任何小于999999990的数字,任何未使用的位置都会有前导零(数字是字符,右对齐和左零填充)。

假设单字节密钥只是字母。

数据已从EBCDIC转换为ASCII。

示例输入:

00000000000000A11111111A11111111A11111111A11111111A11111111A111111110000000000000
00000000000000B22222222A22222222A22222222A22222222A22222222A222222220000000000000
00000000000000C33333333A33333333A33333333A33333333A33333333A333333330000000000000
00000000000000A44444444B44444444B44444444B44444444B44444444B444444440000000000000

预期产出:

              A55555555A55555555A55555555A55555555A55555555A55555555             
              B22222222A22222222A22222222A22222222A22222222A22222222             
              C33333333A33333333A33333333A33333333A33333333A33333333             

(14个空白和13个尾随空白)

预期成交量:万分之

2 个答案:

答案 0 :(得分:1)

我找到了答案:

awk -v FIELDWIDTHS="14 1 8 1 8 1 8 1 8 1 8 1 8 13" \
'{if(!($2 in a)) {a[$2]=$2; c[$2]=$4; e[$2]=$6; g[$2]=$8; i[$2]=$10; k[$2]=$12} \
b[$2]+=$3; d[$2]+=$5; f[$2]+=$7; h[$2]+=$9; j[$2]+=$11; l[$2]+=$13;} END \
{for(id in a) printf("%14s%s%s%s%s%s%s%s%s%s%s%s%s%13s\n","",a[id],b[id],c[id],d[id],e[id],f[id],g[id],h[id],i[id],j[id],k[id],l[id],"");}' input

阐释:

1)拆分字符串

awk -v FIELDWIDTHS="14 1 8 1 8 1 8 1 8 1 8 1 8 13"

2)让2美元成为关键,4美元,6美元,8美元,10美元,12美元将首次设定价值

{if(!($2 in a)) {a[$2]=$2; c[$2]=$4; e[$2]=$6; g[$2]=$8; i[$2]=$10; k[$2]=$12}

3)其他人将被总结

b[$2]+=$3; d[$2]+=$5; f[$2]+=$7; h[$2]+=$9; j[$2]+=$11; l[$2]+=$13;} END

4)打印每个键

{for(id in a) printf("%14s%s%s%s%s%s%s%s%s%s%s%s%s%13s\n","",a[id],b[id],c[id],d[id],e[id],f[id],g[id],h[id],i[id],j[id],k[id],l[id],"");}

答案 1 :(得分:0)

好吧我已经尝试了一些东西

1)从文件中提取重复的密钥并将其存储在重复文件中。

awk '{k=substr($0,1,15);a[k]++}END{for(i in a)if(a[i]>1)print i}' sample > duplicates

OR

awk '{k=substr($0,1,15);print k}' sample | sort | uniq -c | awk '$1>1{print $2}'  > duplicates

2)对于重复项,进行计算并创建具有特定格式的新文件

while read line
do 
grep ^$line sample | awk -F[A-Z] -v key=$line '{for(i=2;i<=7;i++)f[i]=f[i]+$i}END{printf("%14s"," ");for(i=2;i<=7;i++){printf("%s%.8s",substr(key,15,1),f[i]);if(i==7)printf("%13s\n"," ")}}' > newfile
done < duplicates

3)对于唯一的,格式化并附加到newfile

grep -v -f duplicates sample | sed 's/0/ /g' >> newfile  ## gives error if 0 is within data instead of start and end in a row.

OR

grep -v -f duplicates sample | awk '{printf("%14s%s%13s\n"," ",substr($0,15,54)," ")}' >> newfile

如果您有任何疑问,请告诉我。