首页 > 解决方案 > 确定bash关联数组的二维中不同元素的数量?

问题描述

我有一个二维关联数组,其中第二维中的元素数量因第一维中的每个元素而异。每行的行数和列数因每个运行时而异。(仅供参考,行是文件,第二维的第一个元素是每个文件名,后续元素是文件中的数据。)

当我加载数组并将其存储在另一个数组中时,我可以计算第二维中的元素数量 - 这有效 - 但我已经尝试了多个搜索字符串超过几天,但不知道如何知道如何许多元素在每个第二维中都是动态的,因此我可以稍后遍历它们。有没有更好的内置或其他动态方式知道?

请假设我 (A) 在 bash 中执行此操作和 (B) 使用数组而不是操作文件中的数据并使用 bash 出色的文本处理命令有一个压倒一切的原因。谢谢。

#! /bin/bash
declare -A Matrix
num_rows=3
declare -a NumCols
# num_columns=VARIES BY EACH ROW

Matrix[0,0]="Row0"
Matrix[0,1]="Bob"
Matrix[0,2]="Joe"
Matrix[0,3]="Millie"
NumCols[0]=3  # Yes, should be 4 but element 0 is a label for the following data
Matrix[1,0]="Row1"
Matrix[1,1]="Fred"
Matrix[1,2]="Tommy"
NumCols[1]=2
Matrix[2,0]="Row2"
Matrix[2,1]="Alice"
Matrix[2,2]="Nancy"
Matrix[2,3]="Milton"
Matrix[2,4]="Carl"
NumCols[2]=4

# Can I replace NumCols[$i] with an expression?
for ((i=0;i<num_rows;i++)); do
    for ((j=1;j<=NumCols[$i];j++)); do
        echo "${Matrix[$i,0]} : ${Matrix[$i,$j]}"
    done
done

# DESIRED/ACTUAL OUTPUT FOR THIS EXAMPLE
Row0 : Bob
Row0 : Joe
Row0 : Millie
Row1 : Fred
Row1 : Tommy
Row2 : Alice
Row2 : Nancy
Row2 : Milton
Row2 : Carl

标签: bashmultidimensional-array

解决方案


利用 bash 的引用能力,如何:

#!/bin/bash

mat_set() {
    local -n ref="Matrix$1"
    ref[$2]=$3
}

mat_get() {
    local -n ref="Matrix$1"
    echo "${ref[$2]}"
}

mat_numcol() {
    local -n ref="Matrix$1"
    echo "${#ref[@]}"
}

mat_set 0 0 "Row0"
mat_set 0 1 "Bob"
mat_set 0 2 "Joe"
mat_set 0 3 "Millie"

mat_set 1 0 "Row1"
mat_set 1 1 "Fred"
mat_set 1 2 "Tommy"

mat_set 2 0 "Row2"
mat_set 2 1 "Alice"
mat_set 2 2 "Nancy"
mat_set 2 3 "Milton"
mat_set 2 4 "Carl"

num_rows=3
for ((i=0; i<num_rows; i++)); do
    for ((j=1; j<$(mat_numcol "$i"); j++)); do
        echo "$(mat_get "$i" 0) : $(mat_get "$i" "$j")"
    done
done

输出:

Row0 : Bob
Row0 : Joe
Row0 : Millie
Row1 : Fred
Row1 : Tommy
Row2 : Alice
Row2 : Nancy
Row2 : Milton
Row2 : Carl

请注意,它假设第二维的索引是线性对齐的(没有间隙)。否则,我们将需要另一种方法。


推荐阅读