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

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

Ответы [ 13 ]

354 голосов
/ 15 января 2009

Вы можете использовать shuf:

shuf -n 1 $FILE

Существует также утилита под названием rl. В Debian он находится в пакете randomize-lines, который делает именно то, что вы хотите, хотя и не доступен во всех дистрибутивах. На своей домашней странице он на самом деле рекомендует использовать shuf вместо этого (я думаю, его не было на момент создания). shuf является частью ядра GNU coreutils, rl - нет.

rl -c 1 $FILE
72 голосов
/ 16 января 2009

Другая альтернатива:

head -$((${RANDOM} % `wc -l < file` + 1)) file | tail -1
64 голосов
/ 10 ноября 2010
sort --random-sort $FILE | head -n 1

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

26 голосов
/ 23 мая 2016

Это просто.

cat file.txt | shuf -n 1

Конечно, это немного медленнее, чем само по себе "shuf -n 1 file.txt".

14 голосов
/ 15 января 2009

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

perl -e 'srand; rand($.) < 1 && ($line = $_) while <>; print $line;' file

Это имеет существенное преимущество в пространстве перед чтением всего файла. Доказательство этого метода можно найти в книге «Искусство компьютерного программирования», том 2, раздел 3.4.2, автором Дональдом Кнутом.

11 голосов
/ 15 января 2009

с использованием скрипта bash:

#!/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}
4 голосов
/ 15 января 2009

Одиночная линия bash:

sed -n $((1+$RANDOM%`wc -l test.txt | cut -f 1 -d ' '`))p test.txt

Небольшая проблема: повторяющееся имя файла.

3 голосов
/ 15 января 2009

Вот простой скрипт 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
2 голосов
/ 04 сентября 2013

Другой способ использования ' awk '

awk NR==$((${RANDOM} % `wc -l < file.name` + 1)) file.name
1 голос
/ 17 августа 2015

Решение, которое также работает в MacOSX и должно также работать в Linux (?):

N=5
awk 'NR==FNR {lineN[$1]; next}(FNR in lineN)' <(jot -r $N 1 $(wc -l < $file)) $file 

Где:

  • N - количество произвольных строк, которые вы хотите

  • NR==FNR {lineN[$1]; next}(FNR in lineN) file1 file2 -> сохранить номера строк, записанные в file1, а затем распечатать соответствующую строку в file2

  • jot -r $N 1 $(wc -l < $file) -> рисовать N чисел случайным образом (-r) в диапазоне (1, number_of_line_in_file) с jot. Подстановка процесса <() сделает его похожим на файл для интерпретатора, поэтому file1 в предыдущем примере.
...