bash - 确定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
解决方案
利用 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
请注意,它假设第二维的索引是线性对齐的(没有间隙)。否则,我们将需要另一种方法。
推荐阅读
- c# - 将 REST API 从 C# 控制台应用程序迁移并运行到 ASP.NET
- python - 获取错误“函数”对象没有属性“_meta”django 2.0
- java - 使用 Spring Boot 的 RSS 提要
- java - 在 Java 中用于 Cutomer 搜索的 Radix(Trie) 树实现
- postgresql - Postgres 列名或表名什么时候需要引号,什么时候不需要引号?
- python - 当我对 git repos 有依赖项时,如何使用 setuptools 和 pip 自动化依赖项管理?
- c# - 当知道它们并行运行时,使用 xUnit 进行集成测试的策略是什么?
- android - 将 min sdk 更改为 18 并将目标 sdk 更改为 28 时出现颤振错误
- javascript - 导入我的 CSS 文件导致我的 jquery 未定义(ReferenceError)
- c# - ARCore Unity AugmentedImage:视频无法缩放到图像目标