找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 27378|回复: 5

[文本处理] [已解决]批处理如何查找txt文本中每行同一/相同字符串出现最多的次数等于指定数值的行

[复制链接]
发表于 2016-7-6 02:02:17 | 显示全部楼层 |阅读模式
本帖最后由 pcl_test 于 2016-8-4 13:22 编辑

批处理如何查找文本行字串指定出现次数的行。
例:
a.txt文本内容为:
01 01 02 03
01 01 01 02 03
01 01 01 01 02 03
01 01 01 01 01 02 03
01 01 02 02 03
01 01 01 02 02 02 03 03 03
01 01 01 01 02 02 02 02
03 01 03 03 03 02 02 01 03 01
01 02 03 03 02 01 01 03
01 03 02 01 02
忽略字串排列次序不规则的情况,只要每一行有任意一个字串出现最多的次数等于输入的想要查找出现的次数值,把该行输出到b.txt。
每行不同字串出现次数分别叠加计算,比如:01 02 03 03 02 01 01 03 这一行里面01、03都分别出现三次,02出现两次。忽略02出现两次的记录,取出现次数最多的。
可以理解为在每一行里只记录查找同一/相同个字串出现最多的次数,。

如:
(一)我在代码中输入最多的出现次数值2,得出保存b.txt的结果是:
01 01 02 03
01 01 02 02 03
01 03 02 01 02
在a.txt文本内容中只有这三行行内同一字串出现过最多次数为两次,其它的行都有同一字串最多出现过两次以上的。
------------------
(二)我在代码中输入最多的出现次数值3,得出保存b.txt的结果是:
01 01 01 02 03
01 01 01 02 02 02 03 03 03
01 02 03 03 02 01 01 03
在a.txt文本内容中只有这三行行内同一字串出现过最多次数为三次,其它的行同一字串要么最多出现过两次要么出现三次以上。
以此类推查找出现四次、五次...。
====================================

以下是查找文本行个数(长度)的代码:
  1. gawk "NF==次数" a.txt >b.txt
复制代码
思路和这个有类似之处,只不过要提取的不是个数(长度)而是字串出现次数的行。

评分

参与人数 1PB -8 收起 理由
pcl_test -8 渣渣的描述,长还描述不清

查看全部评分

 楼主| 发表于 2016-7-6 10:30:01 | 显示全部楼层
bat能实现吗?
发表于 2016-7-6 10:35:34 | 显示全部楼层
本帖最后由 pcl_test 于 2016-7-6 19:22 编辑
  1. @echo off
  2. rem 指定查找每行同一字符串出现最多的次数
  3. set n=2
  4. for /f "delims=" %%a in ('more +15 "%~f0"') do (
  5.     setlocal enabledelayedexpansion
  6.     set t=0
  7.     for %%b in (%%a) do (
  8.         set /a #%%b+=1
  9.         if !#%%b! gtr !t! set t=!#%%b!
  10.     )
  11.     if !t! equ !n! echo;%%a
  12.     endlocal
  13. )
  14. pause&exit
  15. ::举个栗子
  16. 01 01 02 03
  17. 01 01 01 02 03
  18. 01 01 01 01 02 03
  19. 01 01 01 01 01 02 03
  20. 01 01 02 02 03
  21. 01 01 01 02 02 02 03 03 03
  22. 01 01 01 01 02 02 02 02
  23. 03 01 03 03 03 02 02 01 03 01
  24. 01 02 03 03 02 01 01 03
  25. 01 03 02 01 02
复制代码
 楼主| 发表于 2016-7-6 11:14:45 | 显示全部楼层
本帖最后由 qzwifi 于 2016-7-6 13:06 编辑

回复 3# pcl_test


    的确很渣的描述,见笑了。我为什么就想不到你修改后的这标题呢。够犀利!

    代码试过了,是正确的。起码处理的行数量较少时是正确的。处理比较大的数据时(当前是2.04mb,行数是四万行左右)就光标一直闪找不出来,已经持续两个多小时无变化!

    有没有gawk之类速度快的呢?再写一下处理a.txt,保存b.txt,因为处理的数据库文件非常非常大。劳驾您了,谢谢!
发表于 2016-7-6 13:55:27 | 显示全部楼层
本帖最后由 pcl_test 于 2016-7-6 19:18 编辑

回复 4# qzwifi
  1. /*&cls
  2. @echo off
  3. set "afile=a.txt"
  4. set "bfile=b.txt"
  5. rem 指定查找每行同一字符串出现最多的次数
  6. set n=2
  7. cscript -nologo -e:jscript "%~f0"<"%afile%" %n% >"%bfile%"
  8. pause&exit
  9. */

  10. var n=WSH.Arguments(0), txt='';
  11. while(!WSH.StdIn.AtEndOfStream){
  12.     var line=WSH.StdIn.ReadLine();
  13.     var str=line.split(/\s+/);
  14.     var t=0, s={};
  15.     for(var i=0; i<str.length; i++){
  16.         s[str[i]]?s[str[i]]++:s[str[i]]=1;
  17.         if(s[str[i]]>=t)t=s[str[i]];
  18.     }
  19.     if(t==n)txt+=line+'\r\n';
  20.     s=null;
  21. }
  22. WSH.echo(txt);
复制代码

评分

参与人数 1技术 +1 收起 理由
qzwifi + 1 OK,谢谢

查看全部评分

发表于 2016-7-6 18:58:28 | 显示全部楼层
  1. set "max=3"
  2. gawk "{delete a;for(max=i=1;i<=NF;i++)max=(++a[$i]>max?a[$i]:max)};max==%max%" a.txt > b.txt
复制代码

评分

参与人数 1技术 +1 收起 理由
qzwifi + 1 OK,正是我想要的。神速!非常感谢!

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 03:33 , Processed in 0.012357 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表