Попробуйте использовать встроенную -в оболочке zsh команду wait
-, она сделает всю работу за вас.
% date; sleep 30s &
Tue Aug 8 22:24:07 EDT 2017
[1] 31875
% wait %1; date
[1] + done sleep 30s
Tue Aug 8 22:24:37 EDT 2017
Вы также можете использовать PID вместо спецификации задания -выше. Итак,:
% date; sleep 30s &
Tue Aug 8 22:26:04 EDT 2017
[1] 1821
% wait 1821; date
[1] + done sleep 30s
Tue Aug 8 22:26:34 EDT 2017
Семантика в bash такая же.
Использование awk
s ранд()и srand функции:
awk 'BEGIN{srand()}{print gensub(/(zyx|xyz)1/, "\\1"1 + int(rand() * 5), 1)}' file
В каждой строке заменяется только первое вхождение zyx1
или xyz1
. Если вы хотите заменить все возможные вхождения, измените последнее 1
на"g"
(глобальное ).
Примечание.:Если скрипт выполняется несколько раз в одну и ту же секунду, он может дать один и тот же результат.
If the argument x is omitted, as in ‘srand()’, then the current date and time of day are used for a seed. This is the way to get random numbers that are truly unpredictable.
Если вы этого не хотите, вы можете изменить случайное начальное число на значение по вашему выбору, например наносекундную часть текущего времени, если ваш date
поддерживает это:
seed=$(date '+%N')
awk -v s="$seed" 'BEGIN{srand(s)}{print gensub(/(zyx|xyz)1/, "\\1"1 + int(rand() * 5), 1)}' file
При вызове GNUawk
командыshuf
:
awk 'BEGIN{ cmd="shuf -i 1-5 -n1" }
{ cmd | getline num; close(cmd); sub("1", num) }1' file
Выход:
"xyz3"
zyx4
"http://xyz2"
zyx5
"xyz1"
zyx2