在bash中将数组中的一个键关联多个值

2 arrays bash dictionary

我有一个文本文件,如下所示:

1 aaaa
2 bbbb
3 cccc
4 dddd
2 eeee
2 ffff
4 gggg
Run Code Online (Sandbox Code Playgroud)

我想将它们映射到某种关联数组中,以便我可以访问例如与键 2 关联的所有值以及与键 4 关联的所有值等:

1->aaaa
2->bbbb,eeee,ffff
3->cccc
4->dddd,gggg
Run Code Online (Sandbox Code Playgroud)

我一直无法弄清楚如何使用“declare -A MYMAP”来做到这一点。有一些简单的方法可以做到这一点吗?

- - - - 更新 - - - -

我的键/值对实际上看起来像这样:

bb126.B1 bb126.1.ms.01
bb126.B2 bb126.1.ms.02
bb126.B3 bb126.1.ms.03
bb126.B4 bb126.1.ms.04
Run Code Online (Sandbox Code Playgroud)

who*_*oan 5

这是Shell 参数扩展关联数组的解决方案:

\n\n
# store\ndeclare -A array # this is the only update\nwhile read key value; do\n    array[$key]="${array[$key]}${array[$key]:+,}$value"\ndone < file\n# print\nfor key in "${!array[@]}"; do echo "$key->${array[$key]}"; done\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

解释

\n\n
array[$key]="${array[$key]}${array[$key]:+,}$value"\n
Run Code Online (Sandbox Code Playgroud)\n\n

将每个保存$valuearray[$key]分隔符中,

\n\n
    \n
  • ${array[$key]}保存以前的值(如果有)。
  • \n
  • ${array[$key]:+,},如果有先前的值,则添加一个。
  • \n
  • $value添加新的读取值。
  • \n
\n\n
\n\n
for key in "${!array[@]}"; do echo "$key->${array[$key]}"; done\n
Run Code Online (Sandbox Code Playgroud)\n\n

打印与每个 关联的值$key

\n\n
\n\n

man bash

\n\n
\n

${参数:+单词}
\n 如果parameter 为空或未设置,则不替换任何内容,否则替换word 的扩展。

\n\n

${!name[@]}
\n ${!name[*]}
\n 如果 name 是数组变量,则扩展到 name 中分配的数组索引(键)列表。如果 name 不是数组,则在设置 name 时扩展为 0,否则扩展为 null。当使用 \xe2\x80\x98@\xe2\x80\x99 并且扩展出现在双引号内时,每个键都会扩展为一个单独的单词。

\n
\n\n
\n\n

例子

\n\n
$ cat file\n1 aaaa\n2 bbbb\n3 cccc\n4 dddd\n2 eeee\n2 ffff\n4 gggg\n\n$ ./script.sh \n1->aaaa\n2->bbbb,eeee,ffff\n3->cccc\n4->dddd,gggg\n
Run Code Online (Sandbox Code Playgroud)\n