【问题标题】:Bash reading from a file to an associative arraybash 从文件读取到关联数组
【发布时间】:2014-06-19 23:11:30
【问题描述】:

我正在尝试使用关联数组在 bash 中编写脚本。 我有一个名为data的文件:

a,b,c,d,e,f
g,h,i,j,k,l

以下脚本:

oldIFS=${IFS}
IFS=","

declare -A assoc
while read -a array
do 
  assoc["${array[0]}"]="${array[@]"
done

for key in ${!assoc[@]}
do
  echo "${key} ---> ${assoc[${key}]}"
done 

IFS=${oldIFS}

给我

a ---> a b c d e f

g ---> g h i j k l

我需要我的输出是:

a b ---> c d e f

g h ---> i j k l

【问题讨论】:

    标签: arrays bash associative


    【解决方案1】:
    oldIFS=${IFS}
    IFS=","
    
    declare -A assoc
    while read -r -a array
    do 
      assoc["${array[0]} ${array[1]}"]="${array[@]:2}"
    done < data
    
    for key in "${!assoc[@]}"
    do
      echo "${key} ---> ${assoc[${key}]}"
    done
    
    IFS=${oldIFS}
    

    数据:

    a,b,c,d,e,f
    g,h,i,j,k,l
    

    输出:

    a b ---> c d e f
    g h ---> i j k l
    

    在此处使用Substring Expansion ${array[@]:2} 来获取所需的子字符串作为assoc 数组的值。还添加了-rread 以防止反斜杠充当转义字符。

    根据@gniourf_gniourf 的建议改进:

    declare -A assoc
    while IFS=, read -r -a array
    do 
        ((${#array[@]} >= 2)) || continue
        assoc["${array[@]:0:2}"]="${array[@]:2}"
    done < data
    
    for key in "${!assoc[@]}"
    do
        echo "${key} ---> ${assoc[${key}]}"
    done
    

    【讨论】:

    • 您可以添加一些改进: 1. 将IFS=, 用于read 命令,而不必费心保存IFS 并恢复它。 2. 在循环中添加((${#array[@]}&gt;=2)) || continue 或类似的东西以摆脱空行。 3. 将你的作业写成assoc["${array[@]::2}"]=${array[@]:2}
    • @gniourf_gniourf,${array[@]::2}${parameter:offset:length} 的形式,省略了 offset,然后将 offset 假定为零?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    相关资源
    最近更新 更多