首页 > 解决方案 > 从包含冒号分隔符的文件创建 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   

标签: bash

解决方案


已知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.


推荐阅读