Eu tenho uma matriz que contém itens duplicados, por exemplo
THE_LIST=(
"'item1' 'data1 data2'"
"'item1' 'data2 data3'"
"'item2' 'data4'"
)
Com base no exposto, quero criar uma matriz associativa que atribua itemN
como chave e dataN
como valor.
Meu código itera sobre a lista e atribui key => valor assim (a função adicional é encurtada, pois executa alguns trabalhos adicionais na lista):
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
quando eu imprimo o array, estou recebendo algo como:
item1: data1 data2
item1: data2 data3
item2: data4
mas em vez disso, quero obter:
item1: data1 data2 data3
item2: data4
Não é possível encontrar uma maneira de mesclar as chaves duplicadas, bem como remover valores duplicados para a chave.
Qual seria a abordagem aqui?
ATUALIZAR
O código real é:
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
}
ao imprimir a matriz com:
for i in "${!THE_LIST[@]}"; do
echo "$i : ${THE_LIST[$i]}"
done
eu recebo
item1: data1 data2
item1: data2 data3
item2: data4
Se as chaves e os valores forem garantidos como puramente alfanuméricos, algo assim pode funcionar:
Com a entrada de exemplo, recebo esta saída:
Os itens de dados estão fora de ordem, mas deduplicados.
Pode ser melhor usar Python com o
csv
módulo.Se não houver espaço em branco em nenhum dos valores, essa solução poderá funcionar. Use
awk
arrays associativos para construirdeclare -A
comandos.Isso imprime:
A ordem dos valores é preservada, mas as chaves são reordenadas. Não consegui descobrir como cortar o espaço em branco à direita de uma entrada de matriz,
awk
então usei apenassed
para substituí-lo por uma citação, mas já é um hack total para começar.