我有一个包含重复项的数组,例如
THE_LIST=(
"'item1' 'data1 data2'"
"'item1' 'data2 data3'"
"'item2' 'data4'"
)
基于上述,我想创建一个关联数组,将其分配itemN
为键和dataN
值。
我的代码遍历列表,并像这样分配 key => 值(附加函数被缩短,因为它在列表上执行一些额外的工作):
function get_items(){
KEY=$1
VALUES=()
shift $2
for VALUE in "$@"; do
VALUES[${#VALUES[@]}]="$VALUE"
done
}
declare -A THE_LIST
for ((LISTID=0; LISTID<${#THE_LIST[@]}; LISTID++)); do
eval "LISTED_ITEM=(${THE_LIST[$LISTID]})"
get_items "${LISTED_ITEM[@]}"
THE_LIST=([$KEY]="${VALUES[@]}")
done
当我打印数组时,我得到类似:
item1: data1 data2
item1: data2 data3
item2: data4
但相反,我想得到:
item1: data1 data2 data3
item2: data4
找不到合并重复键以及删除键的重复值的方法。
这里的方法是什么?
更新
实际代码是:
THE_LIST=(
"'item1' 'data1 data2'"
"'item1' 'data2 data3'"
"'item2' 'data4'"
)
function get_backup_locations () {
B_HOST="$2"
B_DIRS=()
B_DIR=()
shift 2
for B_ITEM in "$@"; do
case "$B_ITEM" in
-*) B_FLAGS[${#B_FLAGS[@]}]="$B_ITEM" ;;
*) B_DIRS[${#B_DIRS[@]}]="$B_ITEM" ;;
esac
done
for ((B_IDX=0; B_IDX<${#B_DIRS[@]}; B_IDX++)); do
B_DIR=${B_DIRS[$B_IDX]}
...do stuff here...
done
}
function get_items () {
for ((LOCIDY=0; LOCIDY<${#LOCATIONS[@]}; LOCIDY++)); do
eval "LOCATION=(${LOCATIONS[$LOCIDY]})"
get_backup_locations "${LOCATION[@]}"
THE_LIST=([$B_HOST]="${B_DIR[@]}")
done | sort | uniq
}
打印数组时:
for i in "${!THE_LIST[@]}"; do
echo "$i : ${THE_LIST[$i]}"
done
我明白了
item1: data1 data2
item1: data2 data3
item2: data4
如果保证键和值是纯字母数字的,那么这样的事情可能会起作用:
通过示例输入,我得到以下输出:
数据项无序,但已删除重复数据。
最好将 Python 与
csv
模块一起使用。如果任何值中都没有空格,则此解决方案可能有效。使用
awk
关联数组来构建declare -A
命令。这打印:
值的顺序被保留,但键被重新排序。我不知道如何修剪数组条目的尾随空格,
awk
所以我只是用sed
引号替换它,但它已经是一开始就完全破解了。