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

[文本处理] [已解决]批处理如何将txt文本中每一行以空格分隔的各段数字按大小重新排序?

本帖最后由 pcl_test 于 2016-8-21 20:08 编辑

以下为部分内容要求每行都重新排列 按大小排列
由于内容很大 文件体积大 需求处理效率快的方法  


01 05 07 13 02 06 03
01 05 07 13 02 06 09
01 05 07 13 02 06 11
01 05 07 13 02 06 15
01 05 07 13 02 06 21
01 05 07 13 02 06 22
01 05 07 13 02 06 23
01 05 07 13 02 06 24
01 05 07 13 02 06 25
01 05 07 13 02 06 26
01 05 07 13 02 06 27
01 05 07 13 02 03 09
01 05 07 13 02 03 11
01 05 07 13 02 03 15
01 05 07 13 02 03 21
01 05 07 13 02 03 22
01 05 07 13 02 03 23
01 05 07 13 02 03 24
01 05 07 13 02 03 25
01 05 07 13 02 03 26
01 05 07 13 02 03 27
01 05 07 13 02 09 11
01 05 07 13 02 09 15
01 05 07 13 02 09 21

排序后:
01 02 03 05 06 07 13
01 02 05 06 07 09 13
01 02 05 06 07 11 13
01 02 05 06 07 13 15
01 02 05 06 07 13 21
01 02 05 06 07 13 22
01 02 05 06 07 13 23
01 02 05 06 07 13 24
01 02 05 06 07 13 25
01 02 05 06 07 13 26
01 02 05 06 07 13 27
01 02 03 05 07 09 13
01 02 03 05 07 11 13
01 02 03 05 07 13 15
01 02 03 05 07 13 21
01 02 03 05 07 13 22
01 02 03 05 07 13 23
01 02 03 05 07 13 24
01 02 03 05 07 13 25
01 02 03 05 07 13 26
01 02 03 05 07 13 27
01 02 05 07 09 11 13
01 02 05 07 09 13 15
01 02 05 07 09 13 21
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

  1. powershell -c "gc '文本.txt'|%%{($_ -split '\s+'|sort {[int]$_}) -join ' '}"&pause
复制代码

TOP

js的sort默认是按字符串排序。
  1. @set @n=0//& cscript.exe -nologo -e:jscript "%~f0" &pause&exit/b
  2. var fn = Function("x", "y", "return x-y");
  3. var fs = new ActiveXObject("scripting.FileSystemObject");
  4. var rd = fs.OpenTextFile("1.txt");
  5. var s = "";
  6. while (!rd.AtEndOfStream)
  7. {
  8.   s += rd.ReadLine().split(' ').sort(fn).join(' ')+"\r\n";
  9. }
  10. rd.close();
  11. var wr = fs.OpenTextFile("2.txt", 2, true);
  12. wr.Write(s);
  13. wr.close();
复制代码
1

评分人数

    • web: 速度很快 可以按要求重新排列 非常感谢 讲 ...技术 + 1

TOP

回复 8# weichenxiehou


    谢谢帮助  但经过测试  没有达到要求  无法按从小到大重新排列  速度到是很快

TOP

回复 10# weichenxiehou
哈~ 是的 原来测试文件不一样 搞混了 测试时以为同文件
算了我再去看下 PS 怎么做的

TOP

本帖最后由 PowerShell 于 2013-9-24 14:48 编辑

少于百万行的数据,用excel处理,简单
过亿的数据,用数据库处理,花样多。------数据怎么折腾都行。
脚本是写给人看的,是写给用户看的,而不是写给机子看的
用户能看懂、会修改的脚本,才是好脚本。
写易懂的powershell脚本帮人解决问题,进而让用户学会自渔,吾所愿也

TOP

回复 9# terse
同条件测试了一下,用你这个版本要跑2分10秒哦,慢了不是一点儿啊~ gawk的设计者应该会选最快的排序算法吧……
看得多说得多,远比不上写得多。

TOP

快排就提高了
gawk -f qsort a.txt

qsort:
  1. {
  2.   split($0,arr," ");
  3.   qsort(arr,1,NF);
  4.   printline(arr,NF+1);
  5. }
  6. function qsort(array,p,r)
  7. {
  8.     if (p < r) {
  9.         x=array[p];
  10.         i = p;
  11.         j = r+1;
  12.         while(array[--j] > x );
  13.         while(i < j) {
  14.             t = array[i];
  15.             array[i]=array[j];
  16.             array[j]=t;
  17.             while(array[++i] < x );
  18.             while(array[--j] > x );
  19.         }
  20.         qsort(array, p , j);
  21.         qsort(array, j + 1 , r);
  22.     }
  23. }
  24. function printline(array,nf,t)
  25. {
  26.      for(i=1;i<nf;++i)
  27.        {
  28.          t=t""(t?" ":"") array[i]
  29.          
  30.        }
  31.        print t
  32. }
复制代码

TOP

也来个js的,保存为*.js即可。
我建了一个50几兆的文本,有2457600行,运行terse的gawk代码用了52秒,用js花了35秒,嘿嘿。
  1. var fs=new ActiveXObject("scripting.FileSystemObject");
  2. var rd=fs.OpenTextFile("a.txt",1);
  3. var wt=fs.OpenTextFile("c.txt",2,true);
  4. var ln="";
  5. while(!rd.AtEndOfStream)
  6. {
  7.   ln+=rd.ReadLine().split().sort().join(" ")+"\r\n";
  8. }
  9. wt.Write(ln);
  10. rd.close();wt.close();fs=null;
复制代码
看得多说得多,远比不上写得多。

TOP

其实Excel也满方便的

TOP

回复 5# web
三方不感冒的话 试下  批处理 我这里试了6M多文件 30万行 10多分钟 所以给个三方你
  1. gawk "{split($0,a,\" \");asort(a,b);t=\"\";for (i=1;i<=NF;i++) t=t\"\"(t?\" \":\"\") b[i];print t}" a.txt >c.txt
复制代码
1

评分人数

    • web: 速度很快 可以按要求重新排列技术 + 1

TOP

回复 2# terse


    最少6兆 吧 25万行

TOP

回复 3# batman


    测试过 每行的数不能按顺序排列的

TOP

sort a.txt>new.txt
***共同提高***

TOP

文件大批处理很难有高效代码 话说多大

TOP

返回列表