Как создать сценарий в BASH, который берет случайный текст из файла?

У меня есть файл вроде:

ааа

BBB

ccc

ддд

эээ


И я хочу создать сценарий на BASH, который может взять случайную строку этого текстового файла и вернуть ее мне как переменную или что-то в этом роде.

Я слышал, что это можно сделать с помощью AWK. Любые идеи?

ОБНОВЛЕНИЕ: теперь я использую это:

shuf -n 1 текст.txt

Спасибо всем за помощь!


person lauriys    schedule 26.05.2009    source источник
comment
У вас есть Python или Perl?   -  person Brian C. Lane    schedule 26.05.2009
comment
блин, 5 лет пометить как дубликат   -  person lauriys    schedule 06.06.2014


Ответы (3)


Я использовал такой сценарий, чтобы сгенерировать случайную строку из моего файла одиночных кавычек:

#!/bin/bash

QUOTES_FILE=$HOME/.quotes/quotes.txt
numLines=`wc -l $QUOTES_FILE | cut -d" " -f 1`

random=`date +%N`

selectedLineNumber=$(($random - $($random/$numLines) * $numLines + 1))
selectedLine=`head -n $selectedLineNumber $QUOTES_FILE | tail -n 1`

echo -e "$selectedLine"
person kender    schedule 26.05.2009
comment
+1 Я просто набирал в точности это решение, хотя, вероятно, напечатал бы выбранную строку с помощью sed -n $ selectedLineNumber / p - person Steve Weet; 26.05.2009
comment
Было бы, наверное, лучше, но у меня есть этот скрипт уже много лет, и я почти уверен, что когда я его писал, я полагаю, что мало знал о sed. - person kender; 26.05.2009

Я бы использовал sed с аргументом p ...

sed -n '43p' 

где 43 может быть переменной ...

Я мало что знаю об awk, но я думаю, вы могли бы сделать почти то же самое (однако я не знаю, завершен ли awk по Тьюрингу ...)

person LB40    schedule 26.05.2009

вот способ bash, без каких-либо внешних инструментов

IFS=$'\n'
set -- $(<"myfile")
len=${#@}
rand=$((RANDOM%len+1))
linenum=0
while read -r myline
do
  (( linenum++ ))
  case "$linenum" in
   $rand) echo "$myline";;
  esac
done <"myfile"
person ghostdog74    schedule 15.12.2009