您的位置:首页 > 运维架构 > Shell

bash shell中数组的运用:按照关键字拆分组把大文件拆成多个小文件

2015-11-23 16:49 696 查看
用户有个需求,从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 b
where fb.asset_id = b.ASSET_ID
and fb.depreciate_flag = 'NO'
and fb.idate_ineffective is null


Technorati 标记:
bash,数组




然后按照标签前四位分组,前四位相同的在一个文件中,用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[@]}
doecho -en "$name"
done

3.按照索引来

students=( [0]=zhangsan [d1]=lisi [2]=wangwu)

4.全部读入从文件或者源头

#将数值批量写入到数组中,用 array=( 输出即可) ,另外需要转换下IFS
[root@localhost array-test]# cat shuzu.sh
#!/bin/sh
#set -x
oIFS=$IFS
IFS="
"
users=( `cat /etc/passwd | cut -d : -f "1"` )
for USER in "${users[@]}"
do
echo line: $USER
done
IFS=$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 i
for i in `seq 0 $n`
do
for (( j=${#data[@]} - 1 ; j>i ; j-- ))
 do
#echo $j
if  [[ ${data[j]} -lt ${data[j-1]} ]]
then
t=${data[j]}
data[j]=${data[j-1]}
data[j-1]=$t
fi
done
done
}


数组的复制,将数组var1 给var2

var2=("${var1[@]}")
C风格的var1=( a c )

var2+=("${var1[@]}")

数组的追加

var[${#var[@]}]=last

数组的删除:用 var[7]=

或者 unset var[7]

前者是名存实亡,后者是名亡实亡
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: