这可以是任何可能在典型的类 unix 系统上可用的高级语言(Python、Perl、awk、标准 unix utils {sort、uniq} 等)。希望它能够足够快地报告 2MB 文本文件的唯一术语总数。
我只需要它来进行快速的完整性检查,因此不需要精心设计。
请记住,不区分大小写。
非常感谢你们。
旁注:如果您使用 Python,请不要使用仅版本 3 的代码。我运行它的系统只有 2.4.4。
在 Perl 中:
my %words;
while (<>) {
map { $words{lc $_} = 1 } split /\s/);
}
print scalar keys %words, "\n";
使用 bash/UNIX 命令:
sed -e 's/[[:space:]]\+/\n/g' $FILE | sort -fu | wc -l
在 Python 2.4 中(可能它也适用于早期系统):
#! /usr/bin/python2.4
import sys
h = set()
for line in sys.stdin.xreadlines():
for term in line.split():
h.add(term)
print len(h)
在 Perl 中:
$ perl -ne 'for (split(" ", $_)) { $H{$_} = 1 } END { print scalar(keys%H), "\n" }' <file.txt
仅使用标准 Unix 实用程序:
< somefile tr 'A-Z[:blank:][:punct:]' 'a-z\n' | sort | uniq -c
如果您在没有 Gnu 的系统上tr
,则需要将 " [:blank:][:punct:]
" 替换为您希望将其视为单词分隔符的所有空格和标点字符的列表,而不是单词的一部分,例如," \t.,;
”。
如果您希望输出按频率降序排序,您可以| sort -r -n
在其末尾附加“”。
请注意,这也会产生不相关的空白标记计数;如果您对此感到担忧,则tr
可以使用 sed 过滤掉空行。
这是一个 Perl 单行代码:
perl -lne '$h{lc $_}++ for split /[\s.,]+/; END{print scalar keys %h}' file.txt
或者列出每个项目的计数:
perl -lne '$h{lc $_}++ for split /[\s.,]+/; END{printf "%-12s %d\n", $_, $h{$_} for sort keys %h}' file.txt
这会尝试处理标点符号,以便“foo”。与“foo”一起计算,而“don't”被视为一个单词,但您可以调整正则表达式以满足您的需要。
Python 中的较短版本:
print len(set(w.lower() for w in open('filename.dat').read().split()))
将整个文件读入内存,使用空格将其拆分为单词,将每个单词转换为小写,从小写单词创建一个(唯一的)集合,对它们进行计数并打印输出。
也可以使用一个衬垫:
python -c "print len(set(w.lower() for w in open('filename.dat').read().split()))"
简单(52 次):
perl -nE'@w{map lc,split/\W+/}=();END{say 0+keys%w}'
对于较旧的 perl 版本(55 笔):
perl -lne'@w{map lc,split/\W+/}=();END{print 0+keys%w}'
这是一个 awk oneliner。
$ gawk -v RS='[[:space:]]' 'NF&&!a[toupper($0)]++{i++}END{print i}' somefile