随机单词 Bash 脚本,如果提供一个数字作为第一个命令行参数,那么它将仅从具有那么多字符的单词中选择
Posted
技术标签:
【中文标题】随机单词 Bash 脚本,如果提供一个数字作为第一个命令行参数,那么它将仅从具有那么多字符的单词中选择【英文标题】:Random word Bash script if a number is supplied as the first command line argument then it will select from only words with that many characters 【发布时间】:2017-05-28 04:38:18 【问题描述】:我正在尝试创建一个 Bash 脚本 - 打印一个随机单词 - 如果提供了一个数字作为第一个命令行参数,那么它将仅从具有那么多字符的单词中选择。
这是我在第一部分的内容(打印一个随机单词):
C=$(sed -n "$RANDOM p" /usr/share/dict/words)
echo $C
我真的被第二部分困住了。有人可以帮忙吗?
【问题讨论】:
知道awk -v n=6 'length($0) == n' /usr/share/dict/words
只显示长度为 6 的单词会有帮助吗?
【参考方案1】:
可能会帮助来自 ryans 教程的人
#!/bin/bash
charlen=$1
grep -E "^.$charlen$" $PWD/words.txt | shuf -n 1
【讨论】:
【参考方案2】:您必须使用 while 循环来读取该文件的每一行并检查单词的长度是否等于指定的数字(包括撇号)。在我的操作系统中,它是 99171 行(即文件)。
#!/usr/bin/env bash
readWords()
declare -i int="$1"
(( int == 0 )) &&
printf "%s\n" "$int is 0, cant find 0 words"
return 1
while read getWords;do
if [[ $#getWords -eq $int ]];then
printf "%s\n" "$getWords"
fi
done < /usr/share/dict/words
readWords 20
这个函数接受一个参数。 declare
命令将参数强制转换为整数,如果参数是 string ,则将其强制转换为数字 0 。因为如果指定的参数( number )是 0 (或强制为 0 的字符串)我们没有 0 个单词,则从函数返回。
读取 /usr/share/dict/words 中的每一行,用$#getWords
获取每行的长度($#
>> 给出字符串的长度/命令行参数/数组大小)检查是否等于指定的参数(数字)
【讨论】:
很奇怪,因为我正在关注的教程,只讨论了介绍和变量,现在让我执行这个任务。本教程稍后将讨论循环。没有while循环有没有办法做到这一点? 使用 awk?在 while 循环中使用 awk? 在 while 循环中使用 awk 来解决这个问题是多余的。但是你仍然可以使用 awk 来解决这个问题。既然你问“如何在 bash 中做到这一点”,你必须使用循环【参考方案3】:不需要循环,你可以做类似的事情
CH=$1; # how many characters the word must have
WordFile=/usr/share/dict/words; # file to read from
# find how many words that matches that length
TOTW=$(grep -Ec "^.$CH$" $WordFile);
# pick a random one, if you expect more than 32767 hits you
# need to do something like ($RANDOM+1)*($RANDOM+1)
RWORD=$(($RANDOM%$TOTW+1));
#show that word
grep -E "^.$CH$" $WordFile|sed -n "$RWORD p"
根据您可能需要添加检查的内容,例如 $1 是一个合理的数字、文件存在、TOTW 是 >0 等等。
【讨论】:
【参考方案4】:这段代码可以实现你想要的:
awk -v n="$1" 'length($0) == n' /usr/share/dict/words > /tmp/wordsHolder
shuf -n 1 /tmp/wordsHolder
一些 cmets:通过使用 "$RANDOM"
(就像您在最初的脚本尝试中所做的那样),可以在 0 - 32767
范围内生成一个整数,该整数可能大于(或小于)给定单词上所需的字符数,可用的单词(行)数 - 因此,这里可能出现错误。
为避免这种情况,我们使用shuf
语法,该语法将使用文件的整个范围(来自line 1 - last line of file
)检索文件上的(子)随机选取的单词(行)。
【讨论】:
以上是关于随机单词 Bash 脚本,如果提供一个数字作为第一个命令行参数,那么它将仅从具有那么多字符的单词中选择的主要内容,如果未能解决你的问题,请参考以下文章