【问题标题】:Bi-dimensional associative arrays Unix scripting. How to iterate?二维关联数组 Unix 脚本。如何迭代?
【发布时间】:2018-01-29 08:49:01
【问题描述】:

您好,我正在使用 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 提供的解决方案不符合我的需要。

【问题讨论】:

  • 引用手册页:“Bash 提供一维索引和关联数组变量。”。是否可以用 ele1、ele2 和 ele3 的 3 个不同数组替换二维数组?
  • 您确定要为此目的使用 bash 吗?还有其他脚本语言/编程语言更适合这种数据结构
  • Bash 是一个外壳。 Shell 具有编程语言功能,但也有一些限制——您正在尝试做一些 Shell 不是为之设计的事情。您没有使用正确的工具来完成这项工作。以 python 为例。

标签: bash unix scripting


【解决方案1】:

我不希望你接受这个,因为它没有回答你的问题。但是,作为说明,这是在 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”字符串)。

【讨论】:

  • 谢谢,我对python几乎没有经验,但这似乎是我应该走的路。
  • @GuiomarTuñónHita:无论如何,python 无疑是一项很好的技能。如果您对代码有任何疑问,请随时提问。
【解决方案2】:

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

[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] #

【讨论】:

  • 我已经做到了,效果很好,但是没有其他方法可以避免“if”语句只迭代子组件吗?
  • 恐怕答案是否定的。
猜你喜欢
  • 1970-01-01
  • 2014-01-13
  • 2011-12-28
  • 2015-04-04
  • 2014-05-30
  • 2020-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多