文章目录
一、shell常规初始化的两种方式
1.1 方式一:定义变量后逐个进行赋值
# 先执行变量删除
$ unset map1
# 定义变量map1
$ declare -A map1
# 逐个赋值
$ map1['a']=1
$ map1['b']=2
$ map1['c']=2
# 查看所有元素
$ declare -p map1
declare -A map1='([a]="1" [b]="2" [c]="2" )'
1.2 方式二:定义变量时直接初始化多个值
# 先执行变量删除
$ unset map2
# 初始化并赋多个值
$ declare -A map2=([1]='a' [2]='b' [3]='c')
# 查看所有元素
$ declare -p map2
declare -A map2='([1]="a" [2]="b" [3]="c" )'
二、从终端或者文本获取两列值,直接批量赋值给map
2.1 数据准备
百度搜索深圳区域人口信息,提取关键信息并复制到磁盘文件sz.txt中
column -t 可对输出结果进行格式化 可使用-s自定义列分隔符
awk 中$1 $2 ... 分别对应第1列 第2列 ... 可使用-F自定义列分隔符
2.2 拼接成1.2中"declare -A map2=([1]=‘a’ [2]=‘b’ [3]=‘c’)"这种样式
$ cat sz.txt | awk 'BEGIN{printf "declare -A szm1=("} END {print ")"} {printf "[\"%s\"]=\"%s\" " , $1,$2}'
declare -A szm1=(["名称"]="面积" ["福田区"]="78.66" ["罗湖区"]="78.76" ["南山区"]="187.53" ["盐田区"]="74.64" ["宝安区"]="398.38" ["龙岗区"]="388.21" ["龙华区"]="175.58" ["坪山区"]="167.01" ["光明区"]="155.45" ["大鹏新区"]="600" )
2.3 将2.2作为整体传递给eval函数,完成szm1的初始化及赋值
$ eval $(cat sz.txt | awk 'BEGIN{printf "declare -A szm1=("} END {print ")"} {printf "[\"%s\"]=\"%s\" " , $1,$2}')
# 查看map
$ declare -p szm1
declare -A szm1='([宝安区]="398.38" [名称]="面积" [坪山区]="167.01" [罗湖区]="78.76" [光明区]="155.45" [福田区]="78.66" [龙华区]="175.58" [大鹏新区]="600" [盐田区]="74.64" [龙岗区]="388.21" [南山区]="187.53" )'
# 遍历map
$ for k in `echo ${!szm1[@]}`
> do
> echo $k' : '${szm1[$k]}
> done
宝安区 : 398.38
名称 : 面积
坪山区 : 167.01
罗湖区 : 78.76
光明区 : 155.45
福田区 : 78.66
龙华区 : 175.58
大鹏新区 : 600
盐田区 : 74.64
龙岗区 : 388.21
南山区 : 187.53
2.4 只需将2.3中的$2改为$3…即可获取到常住人口等map
eval $(cat sz.txt | awk 'BEGIN{printf "declare -A szm2=("} END {print ")"} {printf "[\"%s\"]=\"%s\" " , $1,$3}')
eval $(cat sz.txt | awk 'BEGIN{printf "declare -A szm3=("} END {print ")"} {printf "[\"%s\"]=\"%s\" " , $1,$4}')
eval $(cat sz.txt | awk 'BEGIN{printf "declare -A szm4=("} END {print ")"} {printf "[\"%s\"]=\"%s\" " , $1,$5}')
eval $(cat sz.txt | awk 'BEGIN{printf "declare -A szm5=("} END {print ")"} {printf "[\"%s\"]=\"%s\" " , $1,$6}')
# 查看
for k in `echo ${!szm1[@]}`; do echo -e "$k\t${szm1[$k]}\t${szm2[$k]}\t${szm3[$k]}\t${szm4[$k]}\t${szm5[$k]}"; done