2

这可以是任何可能在典型的类 unix 系统上可用的高级语言(Python、Perl、awk、标准 unix utils {sort、uniq} 等)。希望它能够足够快地报告 2MB 文本文件的唯一术语总数。

我只需要它来进行快速的完整性检查,因此不需要精心设计。

请记住,不区分大小写。

非常感谢你们。

旁注:如果您使用 Python,请不要使用仅版本 3 的代码。我运行它的系统只有 2.4.4。

4

8 回答 8

6

在 Perl 中:

my %words; 
while (<>) { 
    map { $words{lc $_} = 1 } split /\s/); 
} 
print scalar keys %words, "\n";
于 2009-05-27T07:38:23.917 回答
5

使用 bash/UNIX 命令:

sed -e 's/[[:space:]]\+/\n/g' $FILE | sort -fu | wc -l
于 2009-05-27T07:34:19.510 回答
4

在 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
于 2009-05-27T07:19:54.450 回答
4

仅使用标准 Unix 实用程序:

< somefile tr 'A-Z[:blank:][:punct:]' 'a-z\n' | sort | uniq -c

如果您在没有 Gnu 的系统上tr,则需要将 " [:blank:][:punct:]" 替换为您希望将其视为单词分隔符的所有空格和标点字符的列表,而不是单词的一部分,例如," \t.,;”。

如果您希望输出按频率降序排序,您可以| sort -r -n在其末尾附加“”。

请注意,这也会产生不相关的空白标记计数;如果您对此感到担忧,则tr可以使用 sed 过滤掉空行。

于 2009-05-27T07:34:47.933 回答
4

这是一个 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”被视为一个单词,但您可以调整正则表达式以满足您的需要。

于 2009-05-27T09:55:37.293 回答
3

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()))"
于 2009-05-30T17:40:52.803 回答
3

简单(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}'
于 2009-05-27T09:19:37.053 回答
0

这是一个 awk oneliner。

$ gawk -v RS='[[:space:]]' 'NF&&!a[toupper($0)]++{i++}END{print i}' somefile
  • “NF”的意思是“如果有一个角色”。
  • '!a[topuuer[$0]++]' 的意思是'只显示 uniq 单词'。
于 2009-05-27T10:53:51.417 回答