如何在不区分大小写的明文文件中计算唯一术语?

时间:2009-05-27 07:18:16

标签: python perl unix count awk

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

我只需要这样做以便快速进行健全性检查,因此不需要精心设计。

请记住,不区分大小写。

非常感谢你们。

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

8 个答案:

答案 0 :(得分:6)

Perl:

my %words; 
while (<>) { 
    map { $words{lc $_} = 1 } split /\s/); 
} 
print scalar keys %words, "\n";

答案 1 :(得分:5)

使用bash / UNIX命令:

sed -e 's/[[:space:]]\+/\n/g' $FILE | sort -fu | wc -l

答案 2 :(得分: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

答案 3 :(得分:4)

仅使用标准的Unix实用程序:

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

如果您使用的是没有Gnu tr的系统,则需要将“[:blank:][:punct:]”替换为您要考虑作为分隔符的所有空格和标点字符的列表单词,而不是单词的一部分,例如“\t.,;”。

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

请注意,这也会产生无关的空白令牌数;如果您对此感到担心,请在tr之后使用sed过滤掉空行。

答案 4 :(得分: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”计算,而“不用”被视为单个单词,但你可以调整正则表达式以满足你的需要。

答案 5 :(得分: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}'

答案 6 :(得分: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()))"

答案 7 :(得分:0)

这是一个awk oneliner。

$ gawk -v RS='[[:space:]]' 'NF&&!a[toupper($0)]++{i++}END{print i}' somefile
  • 'NF'表示'如果有字符'。
  • '!a [topuuer [$ 0] ++]'表示'仅限节目 uniq words'。
相关问题