[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理如何统计txt文本每行字符串出现的次数并将结果按次数多少排序?

本帖最后由 pcl_test 于 2016-7-16 22:23 编辑

有个TXT文件里面有好几个W行,我想做个bat统计一下,得到像如下结果:

内容      出现次数
123         10
333          5
223          3
vbf            1
bfbfd          1
b fbf           1

1.统计每行字符出现的次数
2.按降序排例,出现最多的排在上面。
3.内容与次数用四个空格或者四----等其它特殊符号隔开
4.待处理文件如aa.txt输出文件11.txt

我不懂C语言之类的软件,所以只能用用做好的bat了。
在此多谢先。

本帖最后由 pcl_test 于 2016-8-21 19:26 编辑

回复 23# nono84223860
  1. //&cls&cscript -nologo -e:jscript "%~f0"<"文本.txt">"结果.txt"&pause & exit
  2. var map ={}, arr =[];
  3. while(!WSH.StdIn.AtEndOfStream){
  4.     var line = WSH.StdIn.ReadLine().replace(/^\s*|\s*$/g,'');
  5.     if(!map[line]){
  6.         map[line]=1;
  7.         arr.push(line);
  8.     }else map[line]++;
  9. }
  10. arr.sort(function(a, b){return map[b]-map[a]});
  11. for(var i=0; i<arr.length; i++)WSH.echo(arr[i]+' '+map[arr[i]]);
复制代码

TOP

8G服务器不算啥。
16g内存 +64位os实测
powershell开1.2G文件没问题。
  1. Get-Content a:\pscode\a.txt | Group-Object  -CaseSensitive | Sort-Object -Property count -Descending | Format-List
复制代码
你不就是想统计弱密码么?你这个应该用数据库,
数据库是什么?是索引。
第一次索引很慢,后来就快。而且数据变动,自动更新索引。
而上面的命令出来的统计都也相当于索引,但是临时的,数据库索引可以看成是永久的,和自动更新的。


用数据库的话,是一条一条插入,第一次是很慢很慢的。当然,oracle,新版sql server,有个导入数据功能,提速了很多,
一条条的话,没有什么大小限制了,1tb----5tb都不在话下。

数据库对内存要求也不高,1g内存即可,当然给数据库内存越大越快。
脚本是写给人看的,是写给用户看的,而不是写给机子看的
用户能看懂、会修改的脚本,才是好脚本。
写易懂的powershell脚本帮人解决问题,进而让用户学会自渔,吾所愿也

TOP

本帖最后由 nono84223860 于 2014-5-14 23:07 编辑

回复 6# terse


统计后

513340  a
125258  q      <<<<<<<<<<<<<<<<<<<<---------------------------------
76660  w
71654  z
39801  s
37051  x
29514  l
21589  c
21297  y
19345  z
16611  m
14866  f
14802  h
14050  d
12060  g
11941  b
11021  k
10528  t
10507  j
9588  p
9406  w
6718  q                     <<<<<<<<<<<<<<<<<<<<---------------------------------
6495  A
4691  l
4258  r
3918  e
3402  h
3195  n
3155  v
2813  o
2559  o
2471  E
1763  i
1654  Q
1111  Z
1017  W
933  L
920  u
857  X
777  b
645  H
505  F
491  S
426  G
404  B
393  C
388  Y
384  D
383  O
366  M
307  T
292  K
272  J
235  n
230  P
168  R
114  N
79  I
46  V
21  U
1  y
1  W
1  v
1  u
1  t
1  R
1  O
1  k
1  j
1  I
1  g
1  f

TOP

回复 6# terse



我用了你这个统计出问题了 很多重复,什么原因,存在BUG

跪求啊

TOP

回复 20# terse


    我是用WIN7,64位的系统处理

TOP

回复 6# terse


    这个虽不可以排序特殊符号!等开头,但可以处理800MB以上文件。

TOP

这个真不知道
现在不是内存问题
不知道32位机器处理多大
难道64位会有改善吗 我也不知道

TOP

我的双核四线,8G内存,用这个只能处理300MB以下的数据,大点的打开闪几下就自动关了。
改成b[1]-t  好像差不多。

TOP

回复  terse


    这个非常不错,应完美了。
辛苦了
时间缩短了一半

开始的那个好像是特殊符号( ...
rack 发表于 2013-6-14 18:52

好用就好 但行数是有限制的 可以试着加大t
另 b[1]%%t 换为 b[1]-t  不知道效率提高点不 可试下

TOP

回复 15# Python


    要用的这个就是测试这个文件只有几W行
像我这类文件很多,有几MB,几百MB,上G的都有。

TOP

本帖最后由 rack 于 2013-6-14 19:11 编辑

回复 14# terse


    这个非常不错,应完美了。
辛苦了
时间缩短了一半

开始的那个好像是特殊符号(!,等)开头的排不出来,所以后成了空的。
现在这个所有的符号开头的都排出来了
下面是测试结果:
开头几行:
1904 123456789
213 1234567890
201 woaini1314
170 a123456789
140 987654321
121 abc123456
119 147258369
116 qq123456

结尾的几行:
1 !!!liangsihui
1 !!!635834664QQ
1 !!!381674763.hao
1 !!!198975zd%%%
1 !!!18760239795a
1 !!!!wang1017
1 !!!!963..a
1 !!!!!???
1 !!!!!!520.
1 !!!!!!0309

TOP

回复 11# rack


    顶楼不是说只有几万行吗?不应该上GB吧。另外,试试14楼的代码。

TOP

试着用了下 gawk
  1. (@gawk -vt=10000000000 "{ar[$0]++}END{l=asorti(ar,b);for(i=1;i<=l;i++) a[ar[b[i]]+t,b[i]];asorti(a);for(i=l;i>=1;i--) {split(a[i],b,SUBSEP);print b[1]%%t,b[2]}}")<a.txt >sort.txt
复制代码

TOP

本帖最后由 terse 于 2013-6-13 01:19 编辑

if "!num!" neq "1000000000" echo !num:~1!  !str!
原来这里是考虑尾部为1次的情况
思考一下 应该是错的判断
谢xxpinqz提醒 已修正

TOP

返回列表