标题: [文本处理] [已解决]批处理如何将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多分钟 所以给个三方你- 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秒,嘿嘿。- var fs=new ActiveXObject("scripting.FileSystemObject");
- var rd=fs.OpenTextFile("a.txt",1);
- var wt=fs.OpenTextFile("c.txt",2,true);
- var ln="";
- while(!rd.AtEndOfStream)
- {
- ln+=rd.ReadLine().split().sort().join(" ")+"\r\n";
- }
- wt.Write(ln);
- rd.close();wt.close();fs=null;
复制代码
作者: terse 时间: 2013-9-20 13:10
快排就提高了
gawk -f qsort a.txt
qsort:- {
- split($0,arr," ");
- qsort(arr,1,NF);
- printline(arr,NF+1);
-
- }
- function qsort(array,p,r)
- {
- if (p < r) {
- x=array[p];
- i = p;
- j = r+1;
- while(array[--j] > x );
- while(i < j) {
-
- t = array[i];
- array[i]=array[j];
- array[j]=t;
-
- while(array[++i] < x );
- while(array[--j] > x );
-
- }
- qsort(array, p , j);
- qsort(array, j + 1 , r);
- }
-
- }
-
- function printline(array,nf,t)
- {
- for(i=1;i<nf;++i)
- {
- t=t""(t?" ":"") array[i]
-
- }
- print t
- }
复制代码
作者: 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默认是按字符串排序。- @set @n=0//& cscript.exe -nologo -e:jscript "%~f0" &pause&exit/b
- var fn = Function("x", "y", "return x-y");
- var fs = new ActiveXObject("scripting.FileSystemObject");
- var rd = fs.OpenTextFile("1.txt");
- var s = "";
- while (!rd.AtEndOfStream)
- {
- s += rd.ReadLine().split(' ').sort(fn).join(' ')+"\r\n";
- }
- rd.close();
- var wr = fs.OpenTextFile("2.txt", 2, true);
- wr.Write(s);
- wr.close();
复制代码
作者: pcl_test 时间: 2016-11-1 15:44
- powershell -c "gc '文本.txt'|%%{($_ -split '\s+'|sort {[int]$_}) -join ' '}"&pause
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |