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

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

悬赏金额: 10

原文举例:
aaa
bbbb
cc
ddddd

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


Do All in Command Line

文本文件的内容大概有多少行?

TOP

纯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 编辑 ]

TOP

set/p =退出... ^(%%a^) 退格键退格键<nul
这里带有 退格键12个的呦 论坛没显示出来

TOP

  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可以根据自己的需求自己定义一下长度
努力学习,努力挣分

TOP

为避免以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);
复制代码
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

再来个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);
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

试了一下3楼的代码,针对小文件使用时很好,但用于大文件就非常慢了,我的3M的文件运行了半个小时还没有搞定!能针对大文件做一个代码吗?谢谢,谢谢!感谢各位高手!

TOP

  1. gawk "{print length(), $0}" a.txt | sort -n | csed -n "/^[^0]/ s/^[0-9]\+ //p" >b.txt
复制代码

TOP

返回列表