代码之家  ›  专栏  ›  技术社区  ›  gtunon

二维关联数组Unix脚本。如何迭代?

  •  0
  • gtunon  · 技术社区  · 7 年前

    您好,我正在使用bash,我被困在关联二维数组的迭代中。

    我有以下阵列:

    declare -A x_matrix
    
    x_matrix[ele1,sub1]="asdfadf"
    x_matrix[ele2,sub3]="blabla"
    x_matrix[ele1,sub2]="no matters"
    x_matrix[ele3,sub1]="opps"
    
    elements=(ele1 ele2 ele3)
    

    我想用这样的已知元素进行迭代

    for e in ${elements[@]}; do
        for sub in ${!x_matrix[$e,@]}; do
            echo "($e,$sub)> ${x_matrix[$e,$sub]}"
        done
    done
    

    我喜欢:

    (ele1,sub1)> asdfadf
    (ele1,sub2)> no matters
    (ele2,sub3)> blabla
    (ele3,sub1)> opps
    

    我不知道怎么做,但我相信这应该是可能的。

    [编辑]我已选中此项: BASH: need some help with multidimensional associative arrays 而且提供的解决方案不符合我的需要。

    2 回复  |  直到 7 年前
        1
  •  1
  •   cdarke    7 年前

    我不希望你接受这一点,因为它不能回答你的问题。然而,作为一个例子,这是在python中实现这一点的一种方法。在python中,关联数组称为“字典”,索引数组称为“列表”。

    #!/usr/bin/python
    # Create an empty dictionary
    x_matrix = {}
    
    # Populate each key with a value of an empty dictionary
    x_matrix['ele1'] = {}
    x_matrix['ele2'] = {}
    x_matrix['ele3'] = {}
    
    # Add values to each dictionary
    x_matrix['ele1']['sub1'] = "asdfadf"
    x_matrix['ele2']['sub3'] = "blabla"
    x_matrix['ele1']['sub2'] = "no matters"
    x_matrix['ele3']['sub1'] = "opps"
    
    # Create a list
    elements = ['ele1', 'ele2', 'ele3']
    
    # Iterate
    for e in elements:
        for sub in x_matrix[e].keys():
            print("(%s,%s)> %s" % (e, sub, x_matrix[e][sub]))
    

    给予:

    (ele1,sub2)> no matters
    (ele1,sub1)> asdfadf
    (ele2,sub3)> blabla
    (ele3,sub1)> opps
    

    Pythonistas会找到比这更短的方法,但我想展示简单的步骤,并相对独立于版本(因此没有“f”字符串)。

        2
  •  1
  •   pynexj    7 年前

    你需要自己处理。例如(仅适用于示例数据):

    [STEP 101] # cat foo.sh
    declare -A x_matrix
    
    x_matrix[ele1,sub1]="asdfadf"
    x_matrix[ele2,sub3]="blabla"
    x_matrix[ele1,sub2]="no matters"
    x_matrix[ele3,sub1]="opps"
    
    elements=(ele1 ele2 ele3)
    
    sorted_keys=$( echo ${!x_matrix[@]} | tr ' ' '\n' | sort )
    
    for ele in ${elements[@]}; do
        for k in ${sorted_keys[@]}; do
            if [[ $k == "$ele",* ]]; then
                echo "($k)> ${x_matrix[$k]}"
            fi
        done
    done
    [STEP 102] # bash foo.sh
    (ele1,sub1)> asdfadf
    (ele1,sub2)> no matters
    (ele2,sub3)> blabla
    (ele3,sub1)> opps
    [STEP 103] #