Board logo

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

作者: web    时间: 2013-9-19 21:07     标题: [已解决]批处理如何将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
作者: terse    时间: 2013-9-19 21:14

文件大批处理很难有高效代码 话说多大
作者: batman    时间: 2013-9-19 21:15

sort a.txt>new.txt
作者: web    时间: 2013-9-19 21:39

回复 3# batman


    测试过 每行的数不能按顺序排列的
作者: web    时间: 2013-9-19 21:42

回复 2# terse


    最少6兆 吧 25万行
作者: terse    时间: 2013-9-20 01:32

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

作者: foxJL    时间: 2013-9-20 01:58

其实Excel也满方便的
作者: weichenxiehou    时间: 2013-9-20 10:46

也来个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;
复制代码

作者: terse    时间: 2013-9-20 13:10

快排就提高了
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. }
复制代码

作者: weichenxiehou    时间: 2013-9-20 13:28

回复 9# terse
同条件测试了一下,用你这个版本要跑2分10秒哦,慢了不是一点儿啊~ gawk的设计者应该会选最快的排序算法吧……
作者: PowerShell    时间: 2013-9-20 14:20

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

少于百万行的数据,用excel处理,简单
过亿的数据,用数据库处理,花样多。------数据怎么折腾都行。

作者: terse    时间: 2013-9-20 14:24

回复 10# weichenxiehou
哈~ 是的 原来测试文件不一样 搞混了 测试时以为同文件
算了我再去看下 PS 怎么做的
作者: web    时间: 2013-9-23 20:36

回复 8# weichenxiehou


    谢谢帮助  但经过测试  没有达到要求  无法按从小到大重新排列  速度到是很快
作者: powerbat    时间: 2013-9-23 23:53

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

作者: pcl_test    时间: 2016-11-1 15:44

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





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