bash - 从包含冒号分隔符的文件创建 bash 关联数组
问题描述
我有一个名为 countries.txt 的文件
cat countries.txt
Germany:berlin
Japan:tokyo
usa:washington
canada:ottawa
uk:london
file='countries.txt'
readarray -t countries < "$file"
for i in "${!countries[@]}"
do
echo "key : $i"
echo "value: ${filenames[$i]}"
done
key : 0
value: Germany:berlin
key : 1
value: Japan:tokyo
key : 2
value: usa:washington
key : 3
value: canada:ottawa
key : 4
value: uk:london
我的 bash 版本是 4.1.2
我期望看到的输出是国家的关键和首都的价值观
在下面的 Inian 的帮助下并使用 IFS=: 我得到了一些像这样的奇怪答案
declare -A countries
file='countries.txt'
while IFS=: read -r key value; do
countries["$key"]="$value"
done < "$file"
for cap in "${!countries[@]}"; do
echo "$cap" "${countries[$cap]}"
done
Japan:tokyo
uk london
usa:washington
canada:ottawa
Germany berlin
canada ottawa
Germany:berlin
0 countries.txt
uk:london
usa washington
Japan tokyo
解决方案
已知mapfile
/readarray
内置函数仅bash
创建索引数组。由于您没有提供任何分隔符来拆分输入文件内容,因此该命令仅在数组中为存在的每个输入行创建一个条目。
如果您希望使用之前的值创建一个关联数组以:
用作键,您需要一个while
循环解析分割它的每一行:
并显式声明该数组用作关联数组。请注意,关联数组仅适用于大于 4 的版本。
# declares an explicit associative array
declare -A countries
while IFS=: read -r key value; do
countries["$key"]="$value"
done < "$file"
现在这个数组可以在索引上循环,元素可以打印为
for cap in "${!countries[@]}"; do
printf '%s\n' "$cap" "${countries[$cap]}"
done
有关如何在bash
.
推荐阅读
- python - Python调用c++ DLL:依赖其他dll调用c++函数时的访问冲突写法
- linux - 授予 hdf 删除目录的权限
- javascript - 可以打印出值,但在 setState 中它的“未定义”
- excel - 尝试将单元格从一张纸复制粘贴到另一张纸上?
- javascript - 如何将特定链接从 IE 重定向到 Google Chrome
- docker - Docker_swarm 模块 - ansible 的 join_token 参数不起作用
- extjs - ExtJS 6 What package should I require for Ext.ux.colorpick.Field to work?
- jquery - angular2 simple addClass (jquery style)?
- pandas - rename results in data frame pandas
- javascript - 如何获取数组的值并将其与 window.locaton 匹配