我有一个文本文件,如下所示:
1 aaaa
2 bbbb
3 cccc
4 dddd
2 eeee
2 ffff
4 gggg
我想将它们映射到某种关联数组中,以便我可以访问例如与键 2 关联的所有值以及与键 4 关联的所有值等:
1->aaaa
2->bbbb,eeee,ffff
3->cccc
4->dddd,gggg
我一直无法弄清楚如何使用“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
这是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\narray[$key]="${array[$key]}${array[$key]:+,}$value"\n将每个保存$value在array[$key]分隔符中,:
${array[$key]}保存以前的值(如果有)。${array[$key]:+,},如果有先前的值,则添加一个。$value添加新的读取值。for key in "${!array[@]}"; do echo "$key->${array[$key]}"; done\n打印与每个 关联的值$key。
从man bash:
\n\n\n${参数:+单词}
\n\n
\n 如果parameter 为空或未设置,则不替换任何内容,否则替换word 的扩展。${!name[@]}
\n
\n ${!name[*]}
\n 如果 name 是数组变量,则扩展到 name 中分配的数组索引(键)列表。如果 name 不是数组,则在设置 name 时扩展为 0,否则扩展为 null。当使用 \xe2\x80\x98@\xe2\x80\x99 并且扩展出现在双引号内时,每个键都会扩展为一个单独的单词。
$ 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