2009-05-27 36 views
2

這可以是任何典型的類Unix系統(Python,Perl,awk,標準unix utils {sort,uniq}等)上可用的高級語言。希望能夠快速報告2MB文本文件的唯一條款總數。如何在不區分大小寫的情況下對純文本文件中的獨特術語進行計數?

我只需要這個快速的理智檢查,所以它不需要很好的設計。請記住,大小寫不敏感。

非常感謝你們。

備註:如果您使用Python,請不要使用純版本3代碼。我使用的系統只有2.4.4。

+1

我有時想,人是多麼害怕是蟒蛇性能:使用一個襯墊

也是可能的。我曾經寫過一個腳本,其中包含4GB的dicom圖像,將它們轉換成PNG,將這些PNG轉換爲scipy數組,並將解析後的分割文件轉換爲scipy數組,並將這些內容保存到磁盤 - 從而形成一個32GB的整數山。 完成不到10分鐘。 – bayer 2009-05-27 08:09:40

+0

你的問題到底是什麼?你是否試圖自己解決這個問題?如果是,你遇到了什麼問題?如果不是,爲什麼不呢? – innaM 2009-05-27 08:49:31

回答

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 
5

使用bash/UNIX命令:

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

只使用標準的Unix工具:

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

如果您在沒有Gnu tr的系統上,則需要將「[:blank:][:punct:]」替換爲您希望用作詞語分隔符的所有空格和標點符號的列表,而不是部分一個詞,例如,「\t.,;」。

如果您希望輸出按頻率降序排序,您可以在此末尾附加「| sort -r -n」。

請注意,這也會產生不相關的空白標記數量;如果您擔心這一點,在tr之後,您可以使用sed過濾出空行。

6

在Perl:

my %words; 
while (<>) { 
    map { $words{lc $_} = 1 } split /\s/); 
} 
print scalar keys %words, "\n"; 
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}' 
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」來計算,而「不」被視爲一個單詞,但您可以調整正則表達式以適應您的需求。

0

這是一個awk oneliner。

$ gawk -v RS='[[:space:]]' 'NF&&!a[toupper($0)]++{i++}END{print i}' somefile 
  • 'NF' 表示 '如果有一個人物造型'。
  • '!a [topuuer [$ 0] ++]'表示'只顯示 uniq words'。
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()))" 
相關問題