用户有个需求,从EBS中查出所有未计提折旧的资产,要四个字段,分公司代码(即资产标签前几位),资产标签号,资产启用日期,是否折旧,这些数据要下发给个分公司,要求各个分公司单独成一个文件。用如下sql查出没折旧的信息关联下资产主表和资产帐簿表即可,把查出的数据导成csv格式,用逗号分隔。
select substr(b.TAG_NUMBER, 0, 4) 资产标签前4位,b.TAG_NUMBER 资产标签,b.CREATION_DATE 资产创建日期,fb.DEPRECIATE_FLAG 折旧标识from fa_books fb, fa_additions_v bwhere fb.asset_id = b.ASSET_IDand fb.depreciate_flag = 'NO'and fb.idate_ineffective is null
然后按照标签前四位分组,前四位相同的在一个文件中,用sql也不难实现,就是一个文件查一次,导出一次,纯手工操作,纯体力活,童叟无欺。可是咱比较懒啊,遇到这种事儿当然用程序处理了,当然是也是为了长远打算,以后得查好几次呢,再说来回的折腾数据库,几百万级别的关联查询也很费电的。决定用shell来弄,用awk、sed工具应该很easy实现,这两个工具用起来比较抽象,还是用比较简单的数组来弄,只需6行代码(其实用上分号,也能组合成一行):
orgs=(`cat zhejiu.csv | cut -d , -f 1 |sort -u`)
for ORG in "${orgs[@]}"
do
echo "组织代码,资产标签,资产创建日期,是否折旧" > ${ORG}.csv
grep ^$ORG zhejiu.csv >> ${ORG}.csv
done
把用sort去重后的组织代码放到一个数组中,然后用个循环来处理,grep 关键字时用正则过滤下,^$ORG 只过虑以$ORG开头的行,完美搞定。
再复习下bash shell中数组的使用:bash来自C语言,C的数组都是从0开始的:
5种输入方式:
1.一次一个,这样可以定义稀疏数组
array[0]=zero
array[1]=one
#array[2]=two #即:可以把这个略过,不用连续
array[3]=three
2.一次全部
students=( zhangsan lisi wangwu )
#!/bin/sh
students=( zhang san #张三
li si #李四
wang wu #王五
)
for name in ${students[@]}
do
echo -en "$name"
done
3.按照索引来
students=( [0]=zhangsan [d1]=lisi [2]=wangwu)
4.全部读入从文件或者源头
#将数值批量写入到数组中,用 array=( 输出即可) ,另外需要转换下IFS[root@localhost array-test]# cat shuzu.sh#!/bin/sh#set -xoIFS=$IFSIFS=""users=( `cat /etc/passwd | cut -d : -f "1"` )for USER in "${users[@]}"doecho line: $USERdoneIFS=$oIFS[root@localhost array-test]#
5.从输入读取 ,read -a
[root@localhost array-test]# read -a var
1 2 3
[root@localhost array-test]# echo "you var ${var[0]} then ${var[1]} last is ${var[2]}"
you var 1 then 2 last is 3
[root@localhost array-test]#
#用Shell实现冒泡排序,给定数据data=( 3 1 2 )#!/bin/bash#先计算数组个数n=${data[*]}#定义排序函数bubblesort(){#c版的 for ifor i in `seq 0 $n`dofor (( j=${#data[@]} - 1 ; j>i ; j-- ))do#echo $jif [[ ${data[j]} -lt ${data[j-1]} ]]thent=${data[j]}data[j]=${data[j-1]}data[j-1]=$tfidonedone}
数组的复制,将数组var1 给var2
- var2=("${var1[@]}")
- C风格的var1=( a c )
var2+=("${var1[@]}")
数组的追加
var[${#var[@]}]=last
数组的删除:用 var[7]=
或者 unset var[7]
前者是名存实亡,后者是名亡实亡