Skip to content

Instantly share code, notes, and snippets.

@mttjohnson
Created July 2, 2018 20:10
Show Gist options
  • Select an option

  • Save mttjohnson/5d59853c5222910b44e434a5e7f463e4 to your computer and use it in GitHub Desktop.

Select an option

Save mttjohnson/5d59853c5222910b44e434a5e7f463e4 to your computer and use it in GitHub Desktop.
Bash Array Sort - Percentage distribution of total quantity among array elements
declare THREADS_TOTAL=4 # 600
declare TEST_SCENARIO_PER_BROWSE="25" # 90
declare TEST_SCENARIO_PER_ABANDONED_CART="25" # 5
declare TEST_SCENARIO_PER_CHECKOUT_GUEST="25" # 3
declare TEST_SCENARIO_PER_CHECKOUT_CUSTOMER="25" # 2
############################################################
# Thread distribution calculation and validity checks
############################################################
# Verify all thread percentages equal 100% when added together
declare SCENARIO_PER_TOTAL=$(echo "${TEST_SCENARIO_PER_BROWSE} + ${TEST_SCENARIO_PER_ABANDONED_CART} + ${TEST_SCENARIO_PER_CHECKOUT_GUEST} + ${TEST_SCENARIO_PER_CHECKOUT_CUSTOMER}" | bc)
if (( ${SCENARIO_PER_TOTAL} != 100 )); then
echo "Percentages of scenario do not amount to 100%"
echo "BROWSE: ${TEST_SCENARIO_PER_BROWSE}%"
echo "ABANDONED_CART: ${TEST_SCENARIO_PER_ABANDONED_CART}%"
echo "CHECKOUT_GUEST: ${TEST_SCENARIO_PER_CHECKOUT_GUEST}%"
echo "CHECKOUT_CUSTOMER: ${TEST_SCENARIO_PER_CHECKOUT_CUSTOMER}%"
echo "TOTAL: ${SCENARIO_PER_TOTAL}"
echo "aborting..."
exit;
fi
# calculate percentages in whole numbers
declare THREADS_SCENARIO_BROWSE=$(echo "scale=0; ${THREADS_TOTAL} * ${TEST_SCENARIO_PER_BROWSE} / 100" | bc)
declare THREADS_SCENARIO_ABANDONED_CART=$(echo "scale=0; ${THREADS_TOTAL} * ${TEST_SCENARIO_PER_ABANDONED_CART} / 100" | bc)
declare THREADS_SCENARIO_CHECKOUT_GUEST=$(echo "scale=0; ${THREADS_TOTAL} * ${TEST_SCENARIO_PER_CHECKOUT_GUEST} / 100" | bc)
declare THREADS_SCENARIO_CHECKOUT_CUSTOMER=$(echo "scale=0; ${THREADS_TOTAL} * ${TEST_SCENARIO_PER_CHECKOUT_CUSTOMER} / 100" | bc)
declare THEADS_ADDED=$(echo "${THREADS_SCENARIO_BROWSE} + ${THREADS_SCENARIO_ABANDONED_CART} + ${THREADS_SCENARIO_CHECKOUT_GUEST} + ${THREADS_SCENARIO_CHECKOUT_CUSTOMER}" | bc)
declare THREADS_LEFT_OVER=$(echo "${THREADS_TOTAL} - ${THEADS_ADDED}" | bc)
# define array of threads for sorting purposes and assignment of any left overs
declare -a SCENARIO_THREADS
SCENARIO_THREADS[0]="THREADS_SCENARIO_BROWSE"
SCENARIO_THREADS[1]="THREADS_SCENARIO_ABANDONED_CART"
SCENARIO_THREADS[2]="THREADS_SCENARIO_CHECKOUT_GUEST"
SCENARIO_THREADS[3]="THREADS_SCENARIO_CHECKOUT_CUSTOMER"
declare -a SCENARIO_THREADS_PER
SCENARIO_THREADS_PER[0]="TEST_SCENARIO_PER_BROWSE"
SCENARIO_THREADS_PER[1]="TEST_SCENARIO_PER_ABANDONED_CART"
SCENARIO_THREADS_PER[2]="TEST_SCENARIO_PER_CHECKOUT_GUEST"
SCENARIO_THREADS_PER[3]="TEST_SCENARIO_PER_CHECKOUT_CUSTOMER"
# echo "Before Sort: ${SCENARIO_THREADS[@]}"
# echo "Before Sort Per: ${SCENARIO_THREADS_PER[@]}"
# sort largest value first in array
for ((i=0;i<=${#SCENARIO_THREADS[@]}-1;i++))
do
# echo "I ${i}: ${SCENARIO_THREADS[$i]}: ${!SCENARIO_THREADS[$i]} (${!SCENARIO_THREADS_PER[i]})"
for((j=0;j<=i&&j<${#SCENARIO_THREADS[@]}-1;j++))
do
let "next_to_j=$j+1"
# echo " J $j is: ${SCENARIO_THREADS[$j]} (${!SCENARIO_THREADS[$j]}) < ${SCENARIO_THREADS[$next_to_j]} (${!SCENARIO_THREADS[$next_to_j]})"
# echo " or: ${SCENARIO_THREADS_PER[$j]} (${!SCENARIO_THREADS_PER[$j]}) < ${SCENARIO_THREADS_PER[$next_to_j]} (${!SCENARIO_THREADS_PER[$next_to_j]})"
if ((
"${!SCENARIO_THREADS[$j]}" < "${!SCENARIO_THREADS[$next_to_j]}"
|| "${!SCENARIO_THREADS_PER[$j]}" < "${!SCENARIO_THREADS_PER[$next_to_j]}"
)); then
# echo " swap: ${SCENARIO_THREADS[$j]} (${!SCENARIO_THREADS[$j]}) with ${SCENARIO_THREADS[$next_to_j]} (${!SCENARIO_THREADS[$next_to_j]})"
tmp=${SCENARIO_THREADS[$j]}
SCENARIO_THREADS[$j]=${SCENARIO_THREADS[$next_to_j]}
SCENARIO_THREADS[$next_to_j]=$tmp
tmp=${SCENARIO_THREADS_PER[$j]}
SCENARIO_THREADS_PER[$j]=${SCENARIO_THREADS_PER[$next_to_j]}
SCENARIO_THREADS_PER[$next_to_j]=$tmp
fi
done
done
# echo "After Sort: ${SCENARIO_THREADS[@]}"
# echo "After Sort Per: ${SCENARIO_THREADS_PER[@]}"
# Add any left over threads one at a time to each of the sorted scenarios
for ((i=0;${THREADS_LEFT_OVER}>i;i++))
do
# echo "${i} ${SCENARIO_THREADS[$i]}: ${!SCENARIO_THREADS[$i]}"
declare ${SCENARIO_THREADS[$i]}=$(echo "${!SCENARIO_THREADS[$i]} + 1" | bc)
# echo "${i} ${SCENARIO_THREADS[$i]}: ${!SCENARIO_THREADS[$i]}"
done
# Recalculate totals and any left overs
declare THEADS_ADDED=$(echo "${THREADS_SCENARIO_BROWSE} + ${THREADS_SCENARIO_ABANDONED_CART} + ${THREADS_SCENARIO_CHECKOUT_GUEST} + ${THREADS_SCENARIO_CHECKOUT_CUSTOMER}" | bc)
declare THREADS_LEFT_OVER=$(echo "${THREADS_TOTAL} - ${THEADS_ADDED}" | bc)
# Verify all threads were properly distributed, total correctly, and with no left over threads
if (( ${THEADS_ADDED} != ${THREADS_TOTAL} )); then
echo "All scenario threads added (${THEADS_ADDED}) does not equal the total thread count (${THREADS_TOTAL})."
echo "aborting..."
exit;
fi
if (( ${THREADS_LEFT_OVER} > 0 )); then
echo "There appear to be left over threads (${THREADS_LEFT_OVER}) that were not distributed across the list of scenarios."
echo "aborting..."
exit;
fi
echo "Thread Distribution:"
echo "TOTAL: ${THEADS_ADDED}"
echo "SCENARIO - BROWSE: ${THREADS_SCENARIO_BROWSE} (${TEST_SCENARIO_PER_BROWSE}%)"
echo "SCENARIO - ABANDONED_CART: ${THREADS_SCENARIO_ABANDONED_CART} (${TEST_SCENARIO_PER_ABANDONED_CART}%)"
echo "SCENARIO - CHECKOUT_GUEST: ${THREADS_SCENARIO_CHECKOUT_GUEST} (${TEST_SCENARIO_PER_CHECKOUT_GUEST}%)"
echo "SCENARIO - CHECKOUT_CUSTOMER: ${THREADS_SCENARIO_CHECKOUT_CUSTOMER} (${TEST_SCENARIO_PER_CHECKOUT_CUSTOMER}%)"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment