合并关联数组BASH中的重复键

巴特

我有一个包含重复项的数组,例如

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
muru

如果保证键和值是纯字母数字的,则可能会执行以下操作:

declare -A output

make_list() {
  local IFS=" "
  declare -A keys                  # variables declared in a function are local by default
  for i in "${THE_LIST[@]}"
  do 
    i=${i//\'/}                    # since everything is alphanumeric, the quotes are useless
    declare -a keyvals=($i)        # split the entry, filename expansion isn't a problem
    key="${keyvals[0]}"            # get the first value as the key
    keys["$key"]=1                 # and save it in keys
    for val in "${keyvals[@]:1}"
    do                             # for each value
      declare -A "$key[$val]=1"    # use it as the index to an array. 
    done                           # Duplicates just get reset.
  done

  for key in "${!keys[@]}"
  do                               # for each key
    declare -n arr="$key"          # get the corresponding array
    output["$key"]="${!arr[*]}"    # and the keys from that array, deduplicated
  done
}

make_list
declare -p output  # print the output to check

使用示例输入,我得到以下输出:

declare -A output=([item1]="data3 data2 data1" [item2]="data4" )

数据项乱序,但已删除重复数据。


最好将Python与csv模块一起使用

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

合并关联数组(PHP)中重复名称(键)的值

来自分类Dev

合并关联数组(PHP)中重复名称(键)的值

来自分类Dev

Bash:将空间作为关联数组中的键

来自分类Dev

动态bash关联数组键

来自分类Dev

BASH关联数组重排键

来自分类Dev

合并关联数组

来自分类Dev

关联数组重复

来自分类Dev

合并键在同一数组中匹配的关联数组值

来自分类Dev

合并关联数组,获取最新数组,并删除重复的ID

来自分类Dev

关联数组中的键是否存在

来自分类Dev

在嵌套关联数组中查找键

来自分类Dev

在JavaScript中获取关联数组的键

来自分类Dev

在Bash中循环访问多个数组时,关联数组键中的空格

来自分类Dev

合并/更新具有重叠键的关联数组

来自分类Dev

通过相同的键合并两个关联数组

来自分类Dev

如何使用Shell脚本在关联数组中添加重复键的值?

来自分类Dev

bash中来自querystring的关联数组?

来自分类Dev

bash中的嵌套关联数组

来自分类Dev

在bash中动态创建关联数组

来自分类Dev

在Makefile中迭代bash关联数组

来自分类Dev

关联数组中的关联数组

来自分类Dev

合并PHP关联数组

来自分类Dev

关联数组-键值重复

来自分类Dev

关联数组-重复的键值

来自分类Dev

在关联数组中推送数组键和值

来自分类Dev

从数组内部的关联数组中删除键和值

来自分类Dev

如何从php中的关联数组中删除重复的条目

来自分类Dev

从包含JSON的关联数组中的值中查找键

来自分类Dev

在PHP中合并两个关联数组的问题