Created
July 2, 2018 20:10
-
-
Save mttjohnson/5d59853c5222910b44e434a5e7f463e4 to your computer and use it in GitHub Desktop.
Bash Array Sort - Percentage distribution of total quantity among array elements
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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