먼저, txt 파일에서 임의의 줄을 출력하는 방법을 알고 있습니다.
perl -MList::Util -e 'print List::Util::shuffle <>' words.txt
하지만 txt 파일에서 임의의 4개 단어를 출력하려면 일반적인 솔루션(perl은 일반적으로 모든 유닉스 계열 운영 체제에 설치됨)이 필요합니다. 어떻게 할 수 있습니까?
$ cat words.txt
...
alpha
beta
gamma
delta
epsilon
...
$
"..."는 다른 많은 단어를 의미합니다.
출력 예(그들 사이에 줄 바꿈이 없지만 끝에 유닉스 줄 바꿈이 필요하며 공백으로 구분해야 함):
$ perl SOMEMAGIC words.txt
gamma alpha delta beta
$
Perl만 사용하는 것이 가장 짧은 솔루션입니다(oneliner).
이는 인간에게 기억에 남는 비밀번호 생성기 역할을 합니다.https://xkcd.com/936/
afaik perl은 "임의 생성기"라고 불릴 만큼 훌륭하기 때문입니다.
32768개의 고유 행이 있는 일반적인 영어 단어 테이블의 예:https://pastebin.ubuntu.com/23726760/
답변1
Perl은 실제로 난수를 안전하게 생성하기 위해 타사 라이브러리가 필요하기 때문에 그다지 좋은 도구는 아닙니다. 기본 난수 생성기(rand
또는 동일한 소스의 다른 콘텐츠(예: List::Util::shuffle
보안 관련 목적에 적합하지 않은 콘텐츠)를 사용합니다. Perl을 사용하고 싶다면 설치해주세요수학::무작위::안전(및 해당 종속성) ( perl -MCPAN -eshell
및 실행 install Math::Random::Secure
).
perl -MMath::Random::Secure=rand -l -e '@words = <>; print map $words[rand(@words)], 1..4' words.txt
대신 Python을 사용하는 것이 좋습니다. 오늘날 이는 Perl만큼 일반적이며 표준 라이브러리는 더욱 포괄적입니다. 예, 코드는 더 길지만 단축 코드 자체가 품질을 나타내는 것은 아닙니다.
python -c 'import random, sys; rng = random.SystemRandom(); words = sys.stdin.readlines(); print " ".join([words[rng.randrange(0, len(words))].strip() for i in xrange(4)])' <words.txt
더 읽기 쉬운 여러 줄 형식으로:
import random, sys
rng = random.SystemRandom()
words = sys.stdin.readlines()
print " ".join([words[rng.randrange(0, len(words))].strip() for i in xrange(4)])
또는 골동품이 아닌 GNU coreutils(내장형이 아닌 Linux 및 Cygwin의 경우)가 있는 경우 다음을 사용할 수 있습니다.shuf
유용. options 을 통해 안전한 무작위 생성기를 전달해야 합니다 --random-source
.
shuf --random-source=/dev/urandom -r -n 4 words.txt
답변2
넌 아닌 것 같은데반대하다Perl이 아닌 솔루션의 경우 대부분의 시스템에서 실행될 무언가가 필요합니다. 이 경우 다음은 GNU 핵심 유틸리티만 사용합니다.
sort -R --random-source=/dev/urandom words.txt | head -n4 | paste -s -d' '
shuf
Gilles의 제안에 따라 다음을 사용하도록 수정되었습니다.
shuf -n 4 -r words.txt | paste -s -d' '
답변3
(@Gilles가 언급한 보안 문제는 무시하세요)
perl -0nE '@a=split; say join(" ", map{ $a[rand @a] } 1..4)'
아니면 CamelCase를 선호한다면...
perl -0nE '@a=split; say map{ ucfirst $a[rand @a] } 1..4'