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

[文本处理] 批处理怎样按照字符串长度对文本进行排序?

[复制链接]
发表于 2010-9-7 21:20:29 | 显示全部楼层 |阅读模式
悬赏10未解决
原文举例:
aaa
bbbb
cc
ddddd

希望得到的结果:
cc
aaa
bbbb
ddddd

发表于 2010-9-9 08:56:33 | 显示全部楼层
文本文件的内容大概有多少行?
发表于 2010-9-9 11:51:41 | 显示全部楼层
纯P

  1. @echo off
  2. setlocal enabledelayedexpansion&cls
  3. echo.                · 按照字符串长度对文本进行排序
  4. echo.               
  5. :start ============================================================
  6. if "%~1"=="" (set fname=1.txt) else (if not exist "%~1." (if exist "%~1" (set "fname=%~1") else (echo 文件不存在&goto end)) else (echo 不想处理文件夹&goto end))
  7. cd.>temp1.txt
  8. for /f "tokens=* usebackq delims=" %%a in ("%fname%") do (
  9. call:getStrLen "%%a"
  10. set "strlen=0000!strlen!"&set "strlen=!strlen:~-4!
  11. echo.!strlen!:%%a>>temp1.txt
  12. )
  13. cd.>"%fname%"
  14. for /f "tokens=1,* delims=:" %%a in ('sort temp1.txt') do (echo %%b>>"%fname%")
  15. :end ==============================================================
  16. for /l %%a in (5,-1,1) do (set/p =退出... ^(%%a^)<nul&ping/n 2 127.1>nul)
  17. del temp1.txt
  18. exit /b

  19. ::=======================获得字符串长度==============================
  20. ::返回值在中%strlen%
  21. :getStrLen mystr
  22. set "mystr=%~1"&set "strlen=0"
  23. if not defined mystr goto :eof
  24. for /l %%i in (0,1,8191) do (set strlen=%%i&if "!mystr:~%%i,1!"=="" (goto :eof))
  25. goto :eof
  26. ::==============END======获得字符串长度========== by hf-g ===========
复制代码

[ 本帖最后由 hfg1977 于 2010-9-9 11:53 编辑 ]
发表于 2010-9-9 11:55:31 | 显示全部楼层
set/p =退出... ^(%%a^) 退格键退格键<nul
这里带有 退格键12个的呦 论坛没显示出来
发表于 2010-9-9 21:21:59 | 显示全部楼层
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in (03.txt) do (
  4.   set str=00000000000000000000000000%%a
  5.   set _!str:~-20!=0
  6. )
  7. for /f "tokens=2 delims=0=" %%a in ('set _') do echo %%a
  8. pause
复制代码
对set str=00000000000000000000000000%%a和set _!str:~-20!=0可以根据自己的需求自己定义一下长度
发表于 2010-9-10 21:00:37 | 显示全部楼层
为避免以0开头的行被误处理及兼容特殊字符,来段js
  1. fso = new ActiveXObject('Scripting.FileSystemObject');
  2. s = fso.OpenTextFile('01.txt').ReadAll().replace(/\r/g,''); //'\r'非常恶心!
  3. if (s.slice(-1)=='\n') s=s.slice(0,-1); //需要稍作修整,为下面replace(/^/gm,head)
  4. head=new Array(1000).join('.')+':'; //head为1000个.加一个:
  5. s=s.replace(/^/gm,head).match(/.{1000}$/gm).sort().join('\r\n').replace(/^\.+:/gm,'');
  6. fso.OpenTextFile('02.txt',2,true).Write(s);
复制代码
发表于 2010-9-10 22:21:04 | 显示全部楼层
再来个js
fso = new ActiveXObject('Scripting.FileSystemObject');
s = fso.OpenTextFile('01.txt').ReadAll().replace(/\r/g,'');
if (s.slice(-1)=='\n') s=s.slice(0,-1);
s=s.replace(/^.*$/gm, function(ss){return ss.length+'-'+ss});
s=s.split('\n').sort(
  
function(a,b){return (a.replace(/-.*$/,'') - b.replace(/-.*$/,''));}
)
s=s.join('\r\n').replace(/^\d+-/gm,'');
fso.OpenTextFile('02.txt',2,true).Write(s);
发表于 2011-7-25 11:31:10 | 显示全部楼层
试了一下3楼的代码,针对小文件使用时很好,但用于大文件就非常慢了,我的3M的文件运行了半个小时还没有搞定!能针对大文件做一个代码吗?谢谢,谢谢!感谢各位高手!
发表于 2011-7-25 12:51:06 | 显示全部楼层
  1. gawk "{print length(), $0}" a.txt | sort -n | csed -n "/^[^0]/ s/^[0-9]\+ //p" >b.txt
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 17:06 , Processed in 0.012134 second(s), 6 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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