Как создать bash-скрипт, который случайным образом объединяет указанный список элементов? - PullRequest
0 голосов
/ 27 июня 2019

Скажите, у меня есть 2 списка предметов

Honda
Toyota
Ford
BMW

&

Red
Blue
White
Black
Silver
Yellow

И я должен был написать сценарий bash, который объединяет этот список со случайными конфигурациями. Как бы я это сделал?

Пример вывода:

Honda Black
BMW Yellow
Ford White
Toyota Red

Ответы [ 2 ]

2 голосов
/ 27 июня 2019

Ваш комментарий под ответом указывает, что вы хотите хранить перетасованные списки в самом скрипте, а не полагаться на внешнюю утилиту. Хотя вы можете просто вызывать утилиты в вашем скрипте, вы также можете «разместить список элементов» внутри скрипта, используя массивы в bash. (хотя неясно, имеете ли вы в виду окончательный список или первоначальные списки, использование формы множественного числа предполагает первоначальные списки).

Чтобы сохранить список из файла в массивах в вашем сценарии в произвольном порядке, вы можете просто использовать подстановку команд, например,

brands=( $(shuf brands.txt) )   ## fill brands array with shuffled brands.txt
colors=( $(shuf colors.txt ) )  ## fill colors array with shuffled colors.txt

(если вы хотите оригинальные списки без перетасовки, просто замените shuf на <)

( примечание: , если любая строка может включать пробелы, вы должны установить переменную Внутренний разделитель полей (IFS), чтобы разрывать только символы новой строки перед заполнением ваших массивов, или в качестве альтернативы используйте mapfile -t для их заполнения)

Затем, чтобы выбрать элемент из brands и из colors, чтобы соединить их, просто используйте цикл for в стиле C, чтобы соединить одинаковые индексы, например,

for ((i = 0; i < limit; i++)); do
    printf "%s %s\n" "${brands[i]}" "${colors[i]}"
done

(где limit выше - это меньшее количество элементов между brands и colors)

Собрав весь скрипт и установив IFS, как описано выше, вы можете сделать:

#!/bin/bash

oifs="$IFS"     ## save original IFS (Internal Field Separator)
IFS=$'\n'       ## set IFS to only break on newlines (if spaces in lines)

brands=( $(shuf brands.txt) )   ## fill brands array with shuffled brands.txt
colors=( $(shuf colors.txt ) )  ## fill colors array with shuffled colors.txt

IFS="$oifs"     ## restore original IFS

limit=${#brands[@]}     ## find array with least no. of elements
[ "${#colors[@]}" -lt "$limit" ] && limit=${#colors[@]}

for ((i = 0; i < limit; i++)); do
    printf "%s %s\n" "${brands[i]}" "${colors[i]}"
done

Который при запуске создаст ваши случайные отображения, например

Пример использования / Вывод

$ bash shuffled.sh
BMW White
Ford Yellow
Honda Black
Toyota Blue
1 голос
/ 27 июня 2019

Вы можете сделать это следующим образом. Создайте смешанную версию цветов и брендов, а затем объедините их.

#!/bin/bash

shuf brands.txt > brands_shuffeled.txt
shuf colors.txt > colors_shuffeled.txt
paste -d " " brands_shuffeled.txt colors_shuffeled.txt | grep -v -e "^ " -e ' $'

Команда grep просто удаляет строки, для которых у вас есть только цвет или марка, но не обе части (с вашими данными у нас будут только строки, которые содержат только цвет, поскольку цветов больше, чем марок).

Вывод выглядит так:

Toyota Red
Honda Yellow
Ford Blue
BMW White
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...