Какой простой способ прочитать случайную строку из файла в командной строке Unix? - PullRequest
239 голосов
/ 15 января 2009

Какой простой способ прочитать случайную строку из файла в командной строке Unix?

Ответы [ 13 ]

0 голосов
/ 23 августа 2017

Вот то, что я обнаружил, так как моя Mac OS не использует все простые ответы. Я использовал команду jot для генерации числа, поскольку решения с переменными $ RANDOM в моем тесте не очень случайны. При тестировании моего решения у меня была большая разница в решениях, представленных в выходных данных.

  RANDOM1=`jot -r 1 1 235886`
   #range of jot ( 1 235886 ) found from earlier wc -w /usr/share/dict/web2
   echo $RANDOM1
   head -n $RANDOM1 /usr/share/dict/web2 | tail -n 1

Эхо-переменная для получения визуального отображения сгенерированного случайного числа.

0 голосов
/ 15 июня 2017
#!/bin/bash

IFS=$'\n' wordsArray=($(<$1))

numWords=${#wordsArray[@]}
sizeOfNumWords=${#numWords}

while [ True ]
do
    for ((i=0; i<$sizeOfNumWords; i++))
    do
        let ranNumArray[$i]=$(( ( $RANDOM % 10 )  + 1 ))-1
        ranNumStr="$ranNumStr${ranNumArray[$i]}"
    done
    if [ $ranNumStr -le $numWords ]
    then
        break
    fi
    ranNumStr=""
done

noLeadZeroStr=$((10#$ranNumStr))
echo ${wordsArray[$noLeadZeroStr]}
0 голосов
/ 15 декабря 2015

Использование только vanilla sed и awk и без использования $ RANDOM, простой, экономичный и достаточно быстрый "однострочный" для выбора одной строки псевдослучайно из файла с именем FILENAME выглядит следующим образом:

sed -n $(awk 'END {srand(); r=rand()*NR; if (r<NR) {sub(/\..*/,"",r); r++;}; print r}' FILENAME)p FILENAME

(Это работает, даже если FILENAME пусто, и в этом случае строка не выводится.)

Одним из возможных преимуществ этого подхода является то, что он вызывает rand () только один раз.

Как указал @AdamKatz в комментариях, другой возможностью будет вызывать rand () для каждой строки:

awk 'rand() * NR < 1 { line = $0 } END { print line }' FILENAME

(Простое доказательство правильности может быть дано на основе индукции.)

Предостережение о rand()

"В большинстве реализаций awk, включая gawk, rand () начинает генерировать числа из одного и того же начального номера или seed при каждом запуске awk."

- https://www.gnu.org/software/gawk/manual/html_node/Numeric-Functions.html

...