Объединить повторяющиеся ключи в ассоциативный массив BASH

Con Firefox o Google Chrome, abra las herramientas para desarrolladores (, haga clic con el botón derecho en la página y elija inspeccionar )y luego seleccione la pestaña de red.

Asegúrese de que está registrando las solicitudes y luego inicie sesión normalmente en la página. Desplácese por las solicitudes de red que se registraron (, probablemente habrá muchas )hasta que encuentre la que desea volver a crear. Haga clic derecho en la solicitud y seleccione copiar como curl.

Esto copiará un comando curl en el portapapeles de su sistema que debería poder pegar directamente en su shell recreando la solicitud exacta que hizo el navegador para las cookies, los encabezados y los parámetros de consulta.

1
13.06.2019, 10:49
2 ответа

Если гарантированно, что ключи и значения будут чисто буквенно-цифровыми, что-то вроде этого может сработать:

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.

1
27.01.2020, 23:30

Если ни в одном из значений нет пробелов, это решение может сработать. Используйте ассоциативные массивы awkдля создания команд declare -A.

#!/bin/bash

THE_LIST=(
"'item1' 'data1 data2'"
"'item1' 'data2 data3'"
"'item2' 'data4'"
)

eval "$(\
  for i in "${THE_LIST[@]}"; do
    row=($(eval echo $i))
    echo "${row[@]}"
  done | awk '{ for (i=2; i<=NF; i++) if (seen[$1] !~ $i) { seen[$1]=seen[$1]$i" " } }
    END { for (s in seen) print "declare -A new_list["s"]=\""seen[s] }' | sed 's/[[:space:]]*$/"/'
)"

for i in "${!new_list[@]}"; do
  echo "$i: ${new_list[$i]}"
done

Это печатает:

item2: data4
item1: data1 data2 data3

Порядок значений сохраняется, но порядок ключей изменяется. Я не мог понять, как обрезать конечный пробел записи массива в awk, поэтому я просто использовал sed, чтобы заменить его кавычкой, но для начала это уже полный хак.

1
27.01.2020, 23:30

Теги

Похожие вопросы