我正在尝试创建一个Bash脚本 - 打印一个随机单词 - 如果提供了一个数字作为第一个命令行参数,那么它将只选择具有那么多字符的单词。
这是我在第一部分(打印一个随机单词):
C=$(sed -n "$RANDOM p" /usr/share/dict/words)
echo $C
我真的被第二部分困住了。有人可以帮忙吗?
答案 0 :(得分:0)
你必须使用while循环来读取该文件的每一行,并检查一个单词的长度是否等于指定的数字(包括撇号)。在我的o.s中它是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
命令将参数强制转换为整数,如果参数是字符串,则将其强制转换为0。因为如果指定的参数(数字)为0(或者字符串被强制为0),我们没有0个单词从函数返回。
读取/ usr / share / dict / words中的每一行,用${#getWords}
获取每一行的长度($#
&gt;&gt;给出字符串/命令行参数/数组的长度size)检查它是否等于指定的参数(数字)
答案 1 :(得分:0)
此代码可实现您的目标:
awk -v n="$1" 'length($0) == n' /usr/share/dict/words > /tmp/wordsHolder
shuf -n 1 /tmp/wordsHolder
一些评论:通过使用"$RANDOM"
(就像您在原始脚本尝试中所做的那样),可以生成0 - 32767
范围内的整数,这可能更多(给定一个单词所需的字符数,可以比可用的单词(行数)更少 - 因此,这里可能存在错误。
为了避免这种情况,我们使用shuf
语法,使用其整个范围(来自line 1 - last line of file
)检索文件上的(子)随机选取的单词(行)。
答案 2 :(得分:0)
不需要循环,您可以执行类似
的操作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等等。
答案 3 :(得分:0)
可能会帮助来自ryans教程的人
#!/bin/bash
charlen=$1
grep -E "^.{$charlen}$" $PWD/words.txt | shuf -n 1