|
发表于 2006-3-7 08:05:18
|
显示全部楼层
我没有答案啊... 我也是把自己做的贴出来大家讨论。这种题只有更好的方案,没有确定的答案。这是我做的,有点长了,而且不是真正100% awk,用到了一点shell,但基本上对两个文件的操作都是按awk来做的。
假定第一个文件叫file.1,第二个叫file.2。这是处理file.1的awk程序:
- BEGIN{FIELDWIDTHS="8 10 10 13 14 16 20 13 1"}
- NR>2 {
- l=gensub(/ +/,"","g",$2)
- f=gensub(/ +/,"","g",$3)
- s=gensub(/ +/,"","g",$4)
- if($5!~/\w/){
- p="N/A"
- }else{
- p=gensub(/ +/,"","g",$5)
- }
- if($7!~/\w/){
- e="N/A"
- }else{
- e=gensub(/^ +(\w+ \w+) +/,$1,"g",$7)
- }
- printf "%-10s%-10s%-16s%-20s%-10s\n", f,l,s,p,e
- }
复制代码 这里用到了FIELDWIDTHS这个awk的内置变量。由于是数据库的表,每个单元都有长度定义,这样就好定位那些空单元。剩下是主程序,是shell写的。
- #!/bin/bash
- awk -f awk.file1 file.1 | while read line;do
- f=$(echo $line|awk '{print $1}')
- l=$(echo $line|awk '{print $2}')
- echo | awk -v f="$f" -v l="$l" -v e="$line" '{
- while((getline<"file.2")>0) {
- if(index($0,/[0-9]+/)) {
- if($1~f && $2~l){
- for(i=3;i<=NF;i++){
- j=gensub(/^\$/,"","g",$i)
- sum+=j
- }
- avg=sum/12
- j=0;sum=0
- printf "%-10s%-10s$%.2f\n",e," ",avg
- break
- }
- }
- }
- }'
- done
复制代码
其实本来是一个大的awk程序,但由于定义了FIELDWIDTHS,如果写在一起第二个文件的处理就会出错。我现在也搞不定。所以没办法分开吧。我想肯定有高超的方法。 |
|