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

用户有个需求,从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, 数组
image

然后按照标签前四位分组,前四位相同的在一个文件中,用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 -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]

前者是名存实亡,后者是名亡实亡

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贤时间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值