Вопрос или проблема
в баш-скрипте я выполняю следующее:
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
, как вы уже предложили. Вот как можно реализовать эту логику:
- Создайте файл
options.txt
с вашими настройками. Формат может быть таким:
50 A
25 B
rest C
или
40 A
20 B
15 C
rest D
- Напишите 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
Описание работы скрипта:
-
Чтение данных: Скрипт считывает значения из файлов
howmany.txt
иparallel.txt
, а также изoptions.txt
. -
Формирование массива опций:
- Скрипт собирает процентное соотношение опций и использует его для создания массива, который будет содержать выбранные параметры, с учетом указанных вероятностей.
- Для строки с
rest
вычисляется оставшаяся доля.
-
Выбор случайной опции:
- При помощи
shuf
выбирается случайная опция из массива.
- При помощи
-
Выполнение команды: Скрипт запускает
mycommand
с рандомизированной опцией и передает нужные параметры из файлы.
Примечания:
- Чтобы добавить новую опцию (например,
D
), просто добавьте соответствующую строку вoptions.txt
с нужными вам значениями. - Убедитесь, что в файле
options.txt
сумма процентов не превышает 100, чтобы избежать некорректного выбора.
С таким скриптом вы получите динамическую и расширяемую систему выбора опций, которая будет работать в рамках заданных вами требований.