bash shell中数组的运用:按照关键字拆分组把大文件拆成多个小文件
2015-11-23 16:49
696 查看
用户有个需求,从EBS中查出所有未计提折旧的资产,要四个字段,分公司代码(即资产标签前几位),资产标签号,资产启用日期,是否折旧,这些数据要下发给个分公司,要求各个分公司单独成一个文件。用如下sql查出没折旧的信息关联下资产主表和资产帐簿表即可,把查出的数据导成csv格式,用逗号分隔。
Technorati 标记:
bash,数组
然后按照标签前四位分组,前四位相同的在一个文件中,用sql也不难实现,就是一个文件查一次,导出一次,纯手工操作,纯体力活,童叟无欺。可是咱比较懒啊,遇到这种事儿当然用程序处理了,当然是也是为了长远打算,以后得查好几次呢,再说来回的折腾数据库,几百万级别的关联查询也很费电的。决定用shell来弄,用awk、sed工具应该很easy实现,这两个工具用起来比较抽象,还是用比较简单的数组来弄,只需6行代码(其实用上分号,也能组合成一行):
把用sort去重后的组织代码放到一个数组中,然后用个循环来处理,grep 关键字时用正则过滤下,^$ORG 只过虑以$ORG开头的行,完美搞定。
再复习下bash shell中数组的使用:bash来自C语言,C的数组都是从0开始的:
array[0]=zero
array[1]=one
#array[2]=two #即:可以把这个略过,不用连续
array[3]=three
#!/bin/sh
students=( zhang san #张三
li si #李四
wang wu #王五
)
for name in ${students[@]}
doecho -en "$name"
done
[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]#
数组的复制,将数组var1 给var2
var2=("${var1[@]}")
C风格的var1=( a c )
var2+=("${var1[@]}")
数组的追加
var[${#var[@]}]=last
数组的删除:用 var[7]=
或者 unset var[7]
前者是名存实亡,后者是名亡实亡
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]
前者是名存实亡,后者是名亡实亡
相关文章推荐
- Linux Shell 编程语法
- linux shell编程
- linux截取指定字符shell cut awk
- 使用C编写shellcode
- make -C $(KDIR) M=$(shellpwd) modules
- shell中经常能看到的:>/dev/null 2>&1
- SSH Secure Shell Client中文乱码的解决方法
- shell 学习笔记
- shell 学习笔记
- Linux下创建shell命令集合——你意想不到的软连接
- 找个大牛拿shell,网站权限,数据,重酬
- linux中shell截取字符串方法总结
- C语言system()函数:执行shell命令
- Python调用shell
- Shell编程实例
- linux shell date 时间运算以及时间差计算方法
- fastq to tasta using linux shell script
- 远程登录linux服务器后在.bashrc上的一些环境变量的设置
- 基于行为分析来发现"未知的Webshell"
- shellapi