Было просто интересно, потому что я взбивал это в прошлом месяце.Лучший способ выбрать случайную запись из args?
#!/usr/bin/bash
# Collects all of the args, make sure to seperate with ','
IN="$*"
# Takes everything before a ',' and places them each on a single line of tmp file
echo $IN | sed 's/,/\n/g' > /tmp/pick.a.random.word.or.phrase
# Obvious vars are obvious
WORDFILE="/tmp/pick.a.random.word.or.phrase"
# Pick only one of the vars
NUMWORDS=1
## Picks a random line from tmp file
#Number of lines in $WORDFILE
tL=`awk 'NF!=0 {++c} END {print c}' $WORDFILE`
# Expand random
RANDOM_CMD='od -vAn -N4 -tu4 /dev/urandom'
for i in `seq $NUMWORDS`
do
rnum=$((`${RANDOM_CMD}`%$tL+1))
sed -n "$rnum p" $WORDFILE | tr '\n' ' '
done
printf "\n"
rm /tmp/pick.a.random.word.or.phrase
В основном я спрашиваю:
- мне нужно иметь файл TMP ли?
- Есть ли способ сделать это в одной строке с другой программой?
- Как сконденсировать как можно больше?
Можете ли вы показать пример того, как вы вызываете команду? Неясно, где цифра запятой в описании. –
Кстати, шаблон, который вы используете с «RANDOM_CMD», подвержен серьезным ошибкам - он не будет корректно обрабатывать команды, содержащие литеральные кавычки, экранированные пробелы и т. Д .; см. [BashFAQ # 50] (http://mywiki.wooledge.org/BashFAQ/050) для описания соответствующей передовой практики. –
Вы также можете рассмотреть возможность замены (нестандартной) команды 'seq' на bash-builtin' for ((i = 0; i