Board logo

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

作者: qzwifi    时间: 2016-7-6 02:02     标题: [已解决]批处理如何查找txt文本中每行同一/相同字符串出现最多的次数等于指定数值的行

本帖最后由 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
复制代码
思路和这个有类似之处,只不过要提取的不是个数(长度)而是字串出现次数的行。
作者: qzwifi    时间: 2016-7-6 10:30

bat能实现吗?
作者: pcl_test    时间: 2016-7-6 10:35

本帖最后由 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
复制代码

作者: qzwifi    时间: 2016-7-6 11:14

本帖最后由 qzwifi 于 2016-7-6 13:06 编辑

回复 3# pcl_test


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

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

    有没有gawk之类速度快的呢?再写一下处理a.txt,保存b.txt,因为处理的数据库文件非常非常大。劳驾您了,谢谢!
作者: pcl_test    时间: 2016-7-6 13:55

本帖最后由 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);
复制代码

作者: WHY    时间: 2016-7-6 18:58

  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
复制代码





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