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

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

[复制链接]
发表于 2013-9-19 21:07:51 | 显示全部楼层 |阅读模式
本帖最后由 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

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2013-9-19 21:14:33 | 显示全部楼层
文件大批处理很难有高效代码 话说多大
发表于 2013-9-19 21:15:48 | 显示全部楼层
sort a.txt>new.txt
 楼主| 发表于 2013-9-19 21:39:21 | 显示全部楼层
回复 3# batman


    测试过 每行的数不能按顺序排列的
 楼主| 发表于 2013-9-19 21:42:07 | 显示全部楼层
回复 2# terse


    最少6兆 吧 25万行
发表于 2013-9-20 01:32:54 | 显示全部楼层
回复 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技术 +1 收起 理由
web + 1 速度很快 可以按要求重新排列

查看全部评分

发表于 2013-9-20 01:58:02 | 显示全部楼层
其实Excel也满方便的
发表于 2013-9-20 10:46:40 | 显示全部楼层
也来个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;
复制代码
发表于 2013-9-20 13:10:05 | 显示全部楼层
快排就提高了
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. }
复制代码
发表于 2013-9-20 13:28:10 | 显示全部楼层
回复 9# terse
同条件测试了一下,用你这个版本要跑2分10秒哦,慢了不是一点儿啊~ gawk的设计者应该会选最快的排序算法吧……
发表于 2013-9-20 14:20:48 | 显示全部楼层
本帖最后由 PowerShell 于 2013-9-24 14:48 编辑

少于百万行的数据,用excel处理,简单
过亿的数据,用数据库处理,花样多。------数据怎么折腾都行。
发表于 2013-9-20 14:24:57 | 显示全部楼层
回复 10# weichenxiehou
哈~ 是的 原来测试文件不一样 搞混了 测试时以为同文件
算了我再去看下 PS 怎么做的
 楼主| 发表于 2013-9-23 20:36:07 | 显示全部楼层
回复 8# weichenxiehou


    谢谢帮助  但经过测试  没有达到要求  无法按从小到大重新排列  速度到是很快
发表于 2013-9-23 23:53:04 | 显示全部楼层
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技术 +1 收起 理由
web + 1 速度很快 可以按要求重新排列 非常感谢 讲 ...

查看全部评分

发表于 2016-11-1 15:44:56 | 显示全部楼层
  1. powershell -c "gc '文本.txt'|%%{($_ -split '\s+'|sort {[int]$_}) -join ' '}"&pause
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-20 19:52 , Processed in 0.033352 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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