[英]zsh on MacOS: how to create an associative array (hash table) from the from two column-like scalars?
我有两个列形式的标量值:
% echo $key
hom
doc
fam
echo $val
'home'
'Documents'
'Family'
我想从它们创建关联数组。
我知道创建关联数组的方法如下:
declare -A my_assoc_arr
my_assoc_arr=(hom home doc Documents fam Family)
但是,通过消化$key
和$val
的形式(标量,类列)来创建关联数组的最简单方法是什么? 是否还有其他关联语法,或者我需要努力将$key
和$val
改组为上面的关联语法?
您可能需要一个循环,但不会太乱。 您只需使用两个read
命令一次从每个字符串中读取一行。
typeset -A arr
while IFS= read -u 3 -r k
IFS= read -u 4 -r v
do
arr[$k]=$v
done 3<<< $key 4<<< $val
第一次read
从文件描述符 3 读取(从$key
创建的此处字符串重定向,第二次从文件描述符 4 读取(同样从$val
重定向)。
$ typeset -p arr
typeset -A arr=( [doc]=Documents [fam]=Family [hom]=home )
(这假设key
和val
具有相同的行数。我不想 go 在处理替代方案时陷入困境,这让您决定如何处理剩余的键或值。)
在zsh
中,您还可以使用 'zip' 运算符将两个标准 arrays 重新排列为您提到的关联数组语法:
typeset -a keys=("${(f@)key}") vals=("${(f@)val}")
typeset -A arr=("${(@)keys:^vals}")
部分作品:
${f)...}
- 使用f
参数扩展标志在换行处拆分字符串。"${(@)...}"
- 确保处理空值和带空格的值(这里可能不是绝对必要的)。${...:^...}
- 将两个 arrays 压缩在一起,交替使用每个数组的值。 结果数组将是最短输入数组长度的两倍。typeset -A arr=(k1 v1 k2 v2)
- 从交替的键和值创建一个关联数组。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.