我开始使用这个名为wd的脚本:
cat "$@" | tr -cs '[:alpha:]' '\n' | tr '[:upper:]' '[:lower:]'
| sort | uniq -c | sort -n | awk '{print $2 " " $1}' | sort
将任意数量的文件作为输入,并打印文件中的单词分布,如下所示:
wd file1 file2
blue 2
cat 3
the 5
yes 1
现在我正在尝试添加2个选项:s和t。 s使脚本获取一个名为stopwords的输入文件,并在进行分发之前从输入文件中删除这些单词。 t将数字n作为参数,仅输出前n个单词。默认是所有单词。
所以,到目前为止我有这个脚本。目前,我的问题是当我尝试使用-t 10选项时,它告诉我它找不到文件10,但它应该是一个数字,而不是文件。而且,当我尝试使用-s选项时,它什么都不做,但不输出任何错误。我知道这个问题不是很具体,但我会很感激任何有关错误的想法。
#!/bin/bash
stopwords=FALSE
stopfile=""
topwords=0
while getopts s:t: option
do
case "$option"
in
s) stopwords=TRUE
stopfile="$OPTARG";;
t) topwords=$OPTARG;;
\?) echo "Usage: wd [-s stopfile] [-t n] inputfile"
echo "-s takes words in stopfile and removes them from inputfile"
echo "-t means to output only top n words"
exit 1;;
esac
done
if [ "stopwords" = FALSE ]
then
cat "$@" | tr -cs '[:alpha:]' '\n' | tr '[:upper:]' '[:lower:]'
| sort | uniq -c | sort -nr | head -n $topwords | awk '{print $2 " " $1}' | sort
else
cat "$@" | grep -v -f "$stopfile" | tr -cs '[:alpha:]' '\n' | tr '[:upper:]' '[:lower:]'
| uniq -c | sort -nr | head -n $topwords | awk '{print $2 " " $1}' | sort
fi
答案 0 :(得分:2)
通常在while getopts
循环之后,您需要shift $((OPTIND - 1))
。以下是我之前为ksh
和bash
撰写的示例:
PROGNAME=$0
function _echo
{
printf '%s\n' "$*"
}
function usage
{
cat << END
usage: $PROGNAME [-a] [-b arg] [-h] file...
END
exit $1
}
function parseargs
{
typeset opt v
[[ $# = 0 ]] && usage 1
while getopts ":ab:h" opt "$@"; do
case $opt in
a) _echo -$opt ;;
b) _echo -$opt $OPTARG ;;
h) usage ;;
:) _echo "! option -$OPTARG wants an argument" ;;
'?') _echo "! unkown option -$OPTARG" ;;
esac
done
shift $((OPTIND - 1))
for v in "$@"; do
_echo "$v"
done
}
parseargs "$@"