Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何不敏感地计算明文文件大小写中的唯一项?_Python_Perl_Unix_Count_Awk - Fatal编程技术网

Python 如何不敏感地计算明文文件大小写中的唯一项?

Python 如何不敏感地计算明文文件大小写中的唯一项?,python,perl,unix,count,awk,Python,Perl,Unix,Count,Awk,这可以是在典型的类unix系统(Python、Perl、awk、标准unix-utils{sort、uniq}等)上可用的任何高级语言。希望它足够快,可以报告2MB文本文件中唯一术语的总数 我只需要快速检查一下,所以不需要精心设计 记住,不区分大小写 非常感谢你们 旁注:如果您使用Python,请不要使用仅版本3的代码。我运行它的系统在Python 2.4中只有2.4.4.(可能也适用于早期的系统): 在Perl中: $ perl -ne 'for (split(" ", $_)) { $H{$

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

我只需要快速检查一下,所以不需要精心设计

记住,不区分大小写

非常感谢你们

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

(可能也适用于早期的系统):

在Perl中:

$ perl -ne 'for (split(" ", $_)) { $H{$_} = 1 } END { print scalar(keys%H), "\n" }' <file.txt
my %words; 
while (<>) { 
    map { $words{lc $_} = 1 } split /\s/); 
} 
print scalar keys %words, "\n";

$perl-ne',用于使用bash/UNIX命令(split(“,$”){$H{$\u}=1}结束{print scalar(键%H),“\n”}:

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

仅使用标准Unix实用程序:

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

如果你在一个没有GNU代码> TR 的系统上,你需要用“你想考虑的所有空白和标点符号的列表来代替”<代码> [:BLI::[CITT::/COD> ],而不是一个单词的分隔符,而不是一个单词的一部分,例如“<代码> \t,”。 如果希望输出按频率降序排序,可以在末尾附加“

| sort-r-n

注意,这也将产生一个不相关的空白标记计数;如果您担心这一点,在
tr
之后,可以使用sed过滤掉空行。

在Perl中:

$ perl -ne 'for (split(" ", $_)) { $H{$_} = 1 } END { print scalar(keys%H), "\n" }' <file.txt
my %words; 
while (<>) { 
    map { $words{lc $_} = 1 } split /\s/); 
} 
print scalar keys %words, "\n";
my%字;
而{
映射{$words{lc$\}=1}split/\s/);
} 
打印标量键%words,“\n”;
简单(52个笔划):

对于较旧的perl版本(55个笔划):


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

这是一个awk oneliner

$ gawk -v RS='[[:space:]]' 'NF&&!a[toupper($0)]++{i++}END{print i}' somefile
  • “NF”表示“如果有字符”
  • "!![topuuer[$0]+]'表示“仅显示” uniq单词'

    • 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()))"
      

      对于大小写不敏感-您需要h.add(term.lower()),但它不区分大小写吗?如果我在末尾添加一个“print h”行,对于一个示例文件,我得到:4个set(['bar','Foo','bar','Foo'])。Foo和Foo应该是一样的。啊,我太慢了,伙计们,让我看看你们的评论。很酷,我甚至不知道SetPerl版本也需要$H{lc($)}来区分大小写。我有时想知道人们对python的性能有多害怕。我曾经写过一个脚本,将4GB的dicom图像转换成PNG,将这些PNG转换成scipy数组,解析分割文件,并将其转换成scipy数组,然后将这些内容保存到磁盘,从而形成32GB的整数堆。不到10分钟就完成了。你的问题是什么?你试过自己解决这个问题吗?如果是,您遇到了什么问题?如果没有,为什么不呢?当我必须做这个问题时,计数很容易。这是所有麻烦都潜入的标记化。输入是什么样的?
      python -c "print len(set(w.lower() for w in open('filename.dat').read().split()))"