Board logo

标题: [文本处理] [已解决]批处理如何统计出文本中出现次数最多的一个字符? [打印本页]

作者: wsbdwpshh    时间: 2015-10-21 10:26     标题: [已解决]批处理如何统计出文本中出现次数最多的一个字符?

本帖最后由 wsbdwpshh 于 2015-10-26 11:39 编辑

如何查出一个文本中 出现 最多的一个字?前提是 不知道这个字是 啥字!
作者: pcl_test    时间: 2015-10-21 13:10

本帖最后由 pcl_test 于 2016-8-8 21:02 编辑
  1. //&cls&cscript -nologo -e:jscript "%~f0"<"文本.txt"&pause&exit
  2. var arr={}, max=0;arr['list']=[];
  3. var str=WSH.StdIn.ReadAll().replace(/[ \s]/g, '') //清除空白符
  4. for (var i=0; i<str.length; i++){
  5.     if(!arr[str.charAt(i)]){
  6.         arr['list'].push(str.charAt(i));
  7.         arr[str.charAt(i)]=1
  8.     }else arr[str.charAt(i)]++;
  9. }
  10. arr['list'].sort(function(a, b){return arr[b]-arr[a]});
  11. for(var i=0; i<arr['list'].length; i++){
  12.     if(arr[arr['list'][i]]<max)break;
  13.     WSH.echo(arr['list'][i]+':'+arr[arr['list'][i]]);
  14.     max=arr[arr['list'][i]];
  15. }
复制代码

作者: WHY    时间: 2015-10-21 13:36

本帖最后由 WHY 于 2015-10-21 14:14 编辑
  1. @if (0)==(0) echo off
  2. cscript //nologo //e:jscript "%~f0" < a.txt & pause & exit
  3. @end
  4. var s = WScript.StdIn.ReadAll().replace(/[\r\n]/g, '');
  5. s = s.match(/./g).sort().join('');
  6. var re = /(.)(\1)*/g, n = 0, map = {}, ar;
  7. while(ar = re.exec(s)){
  8.     if (ar[0].length >= n){
  9.         n = ar[0].length;
  10.         map[n]=map[n]?ar[1]+','+map[n]:ar[1];
  11.     }
  12. }
  13. WScript.Echo('最多: ' + map[n] + '\n个数: ' + n)
复制代码

作者: CrLf    时间: 2015-10-21 16:24

借 3 楼代码一用
  1. @if (0)==(0) echo off
  2. cscript //nologo //e:jscript "%~f0" < %0 & pause & exit
  3. @end
  4. var s = WScript.StdIn.ReadAll();
  5. s = s.match(/[^\r\n]/g).sort().join('');
  6. var re = /(.)(\1)*/g, n = 0, ar = [];
  7. s.replace(re,function($0,$1){
  8. n++;
  9. ar.length = ar.length > $0.length ? ar.length : $0.length;
  10. ar[$0.length-1] ? ar[$0.length-1].push($1) : ar[$0.length-1]=[$1];
  11. })
  12. WScript.Echo('最多: ' + ar.pop().join('\r\n') + '\n个数: ' + n);
复制代码

作者: wankoilz    时间: 2015-10-21 16:40

本帖最后由 wankoilz 于 2015-10-22 14:02 编辑

练习awk!
以下代码找出目标文本出现次数前20位的字符:
  1. #&cls&@gawk -f %0 a.txt>con&pause>nul&exit
  2. {
  3.     for(i=1;i<=length($0);i++){
  4.         arr[substr($0,i,1)]++
  5.     }
  6. }
  7. END{
  8.     for (x in arr){
  9. tmp="0000000000"arr[x]
  10.         tmp=substr(tmp,length(arr[x])+1,10)
  11. arr[x]=tmp" "x
  12.     }
  13. len=asort(arr,ta)
  14. for(i=len-19;i<=len;i++){
  15.     printf "%d %s\n",substr(ta[i],1,10),substr(ta[i],11,2)
  16. }
  17. }
复制代码
gawk 4.1.0 下载地址:http://www.bathome.net/viewthread.php?tid=21366&highlight=gawk
作者: 依山居    时间: 2015-10-21 19:05

哈哈,python Counter 简直神器

http://www.zlovezl.cn/articles/collections-in-python/
  1. # -*- coding: utf-8 -*-
  2. """
  3. 下面这个例子就是使用Counter模块统计一段句子里面所有字符出现次数
  4. """
  5. from collections import Counter
  6. s = '''A Counter is a dict subclass for counting hashable objects. It is an unordered collection where elements are stored as dictionary keys and their counts are stored as dictionary values. Counts are allowed to be any integer value including zero or negative counts. The Counter class is similar to bags or multisets in other languages.'''.lower()
  7. c = Counter(s)
  8. # 获取出现频率最高的5个字符
  9. print c.most_common(5)
  10. # Result:
  11. [(' ', 54), ('e', 32), ('s', 25), ('a', 24), ('t', 24)]
复制代码

作者: CrLf    时间: 2015-10-21 20:12

本帖最后由 CrLf 于 2015-10-21 20:49 编辑

回复 6# 依山居


powershell:
  1. $s = 'A Counter is a dict subclass for counting hashable objects. It is an unordered collection where elements are stored as dictionary keys and their counts are stored as dictionary values. Counts are allowed to be any integer value including zero or negative counts. The Counter class is similar to bags or multisets in other languages.'
  2. [char[]]$s | group-object | sort-object -desc count|select-object -first 5
复制代码
极限压缩后的代码长度和你差不多:
  1. ([char[]]$s|group|sort *)[-1..-5]
复制代码

作者: 依山居    时间: 2015-10-21 20:13

吐槽,能不设置成作者可见吗
作者: 依山居    时间: 2015-10-21 20:15

回复 7# CrLf


    这帖子被设置作者可见了,你说啥我都看不到。
作者: CrLf    时间: 2015-10-21 20:47

回复 9# 依山居


    done
作者: 依山居    时间: 2015-10-21 20:55

回复 10# CrLf


    你开了好多技能树。。
作者: CrLf    时间: 2015-10-21 20:58

回复 11# 依山居


    所以把技能点用光了
作者: pcl_test    时间: 2016-8-16 17:35

第三方http://www.bathome.net/s/tool/index.html?key=gawk
  1. #*&cls&@gawk -f "%~f0" "文本.txt">con&pause&exit
  2. {
  3.     gsub(/[[:space:]]/,"");
  4.     for(i=1;i<=length($0);i++)a[substr($0,i,1)]++;
  5. }
  6. END{
  7.     for(b in a){
  8.         if(c[a[b]]){
  9.             c[a[b]]=c[a[b]]" "b;
  10.         }else{
  11.             c[a[b]]=""b;
  12.             d[a[b]]=a[b];
  13.         }
  14.     }
  15.     for(i=asort(d);i>0;i--)print d[i]":"c[d[i]];
  16. }
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2