Можно использовать shuf
:
shuf -n 1 $FILE
существует также утилита, названная rl
. В Debian это находится в randomize-lines
пакет, который делает точно, что Вы хотите, хотя не доступный во всех дистрибутивах. На его домашней странице это на самом деле рекомендует использование shuf
вместо этого (который не существовал, когда это было создано, я верю). shuf
часть GNU coreutils, rl
не.
rl -c 1 $FILE
Вот простой сценарий Python, который сделает задание:
import random, sys
lines = open(sys.argv[1]).readlines()
print(lines[random.randrange(len(lines))])
Использование:
python randline.py file_to_get_random_line_from
использование сценария удара:
#!/bin/bash
# replace with file to read
FILE=tmp.txt
# count number of lines
NUM=$(wc - l < ${FILE})
# generate random number in range 0-NUM
let X=${RANDOM} % ${NUM} + 1
# extract X-th line
sed -n ${X}p ${FILE}
Другая альтернатива:
head -$((${RANDOM} % `wc -l < file` + 1)) file | tail -1
Единственная строка удара:
sed -n $((1+$RANDOM%`wc -l test.txt | cut -f 1 -d ' '`))p test.txt
Небольшая проблема: дублирующееся имя файла.
perlfaq5: Как я выбираю случайную строку из файла? Вот выбирающий водохранилище алгоритм из Книги Camel:
perl -e 'srand; rand($.) < 1 && ($line = $_) while <>; print $line;' file
Это имеет значительное преимущество в пространстве по чтению целого файла в. Можно найти доказательство этого метода в Искусстве Программирования, Объем 2, Раздел 3.4.2, Donald E. Knuth.