Добавить опцию случайного выбора в bash-скрипт

Вопрос или проблема

в баш-скрипте я выполняю следующее:

seq 1 $(<howmany.txt) | xargs -I% -n1 -P$(<parallel.txt) mycommand --infile file% --option A --outfile file%.new

это работает.

значения в howmany.txt и parallel.txt поступают из других скриптов в эти файлы.

в этом примере в howmany.txt значение 48, а в parallel.txt значение 4.

howmany.txt всегда в диапазоне не менее 4 и максимум не более 99.

parallel.txt всегда в диапазоне не менее 4 и максимум не более 16.

как добавить новую функцию: --option N ?

в options.txt находятся значения: A, B и C :

в строке 1 значение: `A`
в строке 2 значение: `B`
в строке 3 значение: `C`

как можно рандомизировать так, чтобы в 50% случаев использовать --option A, в 25% случаев использовать --option B и оставшиеся 25% использовать --option C ?

в некоторых случаях, когда это невозможно явно разделить, необходимо округлить вверх или вниз, это не проблема.
возможно ли установить это так, чтобы опцию D можно было добавить позже?

лучший способ мог бы быть в том, чтобы в options.txt записать

50 A
25 B
остальное C

или

40 A
20 B
15 C
остальное D

Если вы можете создать options.txt так, чтобы было равное распределение между строками, возможно, повторяя буквы по мере необходимости, то вы можете записать: --option "$( shuf -n1 options.txt )"

(И, вероятно, вы должны обернуть ваши другие конструкции $( … ) в кавычки.)

Ответ или решение

Для добавления функции выбора случайного параметра --option N в ваш bash-скрипт с учетом требований, описанных в вашем вопросе, вы можете использовать файл конфигурации options.txt, как вы уже предложили. Вот как можно реализовать эту логику:

  1. Создайте файл options.txt с вашими настройками. Формат может быть таким:
50 A
25 B
rest C

или

40 A
20 B
15 C
rest D
  1. Напишите Bash-скрипт, который будет считывать значения из этого файла, подсчитывать количество записей для выбора опции и будет использовать shuf для рандомизации.

Вот пример реализации:

#!/bin/bash

# Чтение количества работ и параллельных процессов
howmany=$(<howmany.txt)
parallel=$(<parallel.txt)

# Чтение значений из options.txt и формирование массива
while read -r line; do
    percent=$(echo "$line" | awk '{print $1}')
    option=$(echo "$line" | awk '{print $2}')

    if [[ "$option" == "rest" ]]; then
        # Для "rest" помещаем оставшуюся часть
        rest_percent=$((100 - total_percentage))
        options+=($(for ((i=0; i<rest_percent; i++)); do echo "$option"; done))
    else
        # Заполняем массив на основе процентов
        total_percentage=$((total_percentage + percent))
        for ((i=0; i<percent; i++)); do
            options+=("$option")
        done
    fi
done < options.txt

# Случайное перемешивание массива опций
random_option=$(printf '%s\n' "${options[@]}" | shuf -n 1)

# Выполнение команды с выбранным вариантом
seq 1 "$howmany" | xargs -I% -n1 -P"$parallel" mycommand --infile file% --option "$random_option" --outfile file%.new

Описание работы скрипта:

  1. Чтение данных: Скрипт считывает значения из файлов howmany.txt и parallel.txt, а также из options.txt.

  2. Формирование массива опций:

    • Скрипт собирает процентное соотношение опций и использует его для создания массива, который будет содержать выбранные параметры, с учетом указанных вероятностей.
    • Для строки с rest вычисляется оставшаяся доля.
  3. Выбор случайной опции:

    • При помощи shuf выбирается случайная опция из массива.
  4. Выполнение команды: Скрипт запускает mycommand с рандомизированной опцией и передает нужные параметры из файлы.

Примечания:

  • Чтобы добавить новую опцию (например, D), просто добавьте соответствующую строку в options.txt с нужными вам значениями.
  • Убедитесь, что в файле options.txt сумма процентов не превышает 100, чтобы избежать некорректного выбора.

С таким скриптом вы получите динамическую и расширяемую систему выбора опций, которая будет работать в рамках заданных вами требований.

Оцените материал
Добавить комментарий

Капча загружается...