【发布时间】:2014-09-14 18:35:38
【问题描述】:
到目前为止,我的 bash 脚本有两个参数……输入可以是文件或目录,输出可以是输出文件。它递归地查找所有文件,如果输入是一个文件,它会在找到的所有文件中查找每个单词的所有出现,并在输出文件中列出它们,左侧的数字和右侧的单词从大到小排序。现在它也将数字计算为它不应该做的单词......我怎么能让它只找到所有出现的有效单词而没有数字?此外,在最后一个 if 语句中......如果输入是一个目录,我很难让它做我让它为文件做的同样的事情。它需要查找该目录中的所有文件,如果该目录中有另一个目录,则需要查找其中的所有文件,依此类推。然后它需要计算所有文件中每个单词的所有出现次数,并将它们存储到输出文件中,就像文件的情况一样。我正在考虑将它们存储在一个数组中,但我不确定它是否是最好的方法,而且我的语法是关闭的,因为它不起作用......所以我想知道我该怎么做?谢谢!
#!/bin/bash
INPUT="$1"
OUTPUT="$2"
ARRAY=();
# Check that there are two arguments
if [ "$#" -ne 2 ]
then
echo "Usage: $0 {dir-name}";
exit 1
fi
# Check that INPUT is different from OUTPUT
if [ "$INPUT" = "$OUTPUT" ]
then
echo "$INPUT must be different from $OUTPUT";
fi
# Check if INPUT is a file...if so, find number of occurrences of each word
# and store in OUTPUT file sorted in greatest to least
if [ -f "$INPUT" ]
then
for name in $INPUT; do
if [ -f "$name" ]
then
xargs grep -hoP '\b\w+\b' < "$name" | sort | uniq -c | sort -n -r > "$OUTPUT"
fi
done
# If INPUT is a directory, find number of occurrences of each word
# and store in OUTPUT file sorted in greatest to least
elif [ -d "$INPUT" ]
then
find $name -type f > "${ARRAY[@]}"
for name in "${ARRAY[@]}"; do
if [ -f "$name" ]
then
xargs grep -hoP '\b\w+\b' < "$name" | sort | uniq -c | sort -n -r > "$OUTPUT"
fi
done
fi
【问题讨论】:
-
您能否展示您的输入文件、预期输入和预期输出的示例。例如不清楚
for name in $INPUT应该做什么......因为$INPUT应该是一个论点? -
你在做词频分析吗?你可能想先转换为小写,接受
-和其他一些东西。只是一个想法。你是用普通字母还是有特殊字符? -
"我怎样才能让它只找到所有出现的有效单词而没有数字?"使用
grep -hoP '\b[[:alpha:]]+\b'代替grep -hoP '\b\w+\b' -
@BroSlow 输入可以是任何类型的文件或目录。预期输出:17 字。旁边有单词的出现次数列表。
name in $INPUT是输入中的每个文件名。
标签: bash