- 论坛徽章:
- 0
|
Shell下AWK关联数组.只是简单的测试了一下使用的方法。
可以利用关联数组处理文本中分类数据的加总和求值。
如果一条一条的读入、判断分类、再加总就比较麻烦了。
测试用法:
$ cat zz.txt
A,0.50,1.20
A,0.3,1.81
B,0.1,0.08
B,0.3,0.6
C,1.0,1,7
C,1.0,1.9
C,3.2,1.6
按照第一项的大类,对某一列加总
$ cat zz122.sh
#!/bin/sh
awk -F',' '{
grp[$1] += $2
}
END {
for (gr11 in grp)
printf "%s : %f\n", gr11, grp[gr11]
}
' zz.txt;
$ ./zz122.sh
A : 0.800000
B : 0.400000
C : 5.200000
按照第一项的其中一类,对每一列加总 ,测试没用数组
$ cat zz123.sh
#!/bin/sh
awk -F',' -v type="A" '$1==type {
total1 += $2
total2 += $3
cnt += 1
}
END {
print total1/cnt,total2/cnt
}
' zz.txt;
$ ./zz123.sh
0.4 1.505
按照第一项的其中一类,对每一列加总,求平均值
$ cat zz121.sh
#!/bin/sh
awk -F',' -v type="A" '$1==type {
for (i=2; i<=NF; i++)
total += $i
cnt += 1
}
END {
for (i=2; i<=NF; i++)
printf "%s,", total/cnt
printf "\n"
}
' zz.txt;
$ ./zz121.sh
0.4,1.505,
对每一行进行加总 求平均数 和总的平均数
$ cat zz120.sh
#!/bin/sh
awk -F',' '{
for (i=2; i<=NF; i++) {
totalline[NR] += $i;
}
cnt += 1;
print totalline[NR],cnt,NR,totalline[NR]/(NF-1);
}
END {
for (i=1; i<=FNR; i++) {
total += totalline;
}
printf "total: %s num %s average %s \n",total,FNR,total/FNR;
}' zz.txt;
$ ./zz120.sh
1.7 1 1 0.85
2.11 2 2 1.055
0.18 3 3 0.09
0.9 4 4 0.45
9 5 5 3
2.9 6 6 1.45
4.8 7 7 2.4
total: 21.59 num 7 average 3.08429
还有是shell变量在Awk中的引用的测试:
#!/bin/sh
i=1
echo "12:30:00" | awk 'BEGIN {FS=":"} {print $'$i'":"$('$i'+1)+15":"$3}';
结果:12:45:00
发上来方便备查。。。。。。
[ 本帖最后由 zglcl008 于 2006-11-3 20:53 编辑 ] |
|