有没有简单的方法可以将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个尾随空白)
预期成交量:万分之
答案 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
如果您有任何疑问,请告诉我。