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

[文本处理] 批处理如何将txt文本的行内容以第一列字符串/字段的长度排序

本帖最后由 pcl_test 于 2016-7-7 23:32 编辑

因为注册了很多论坛,帐号密码也不一样,所以准备把他放入txt里面

但很多论坛地址域名长度不一,如果不按长度排序的话,会感觉很别扭

我的格式是这样的:

www.baidutama.com User Rasm Password Mima
www.google.com User Rasm Password Mima
www.baidut.com User Rasm Password Mima
www.pp.com User Rasm Password Mima
www.163.com User Rasm Password Mima
www.123.com User Rasm Password Mima
www.hxbaidugoogle.com User Rasm Password Mima

主要是前面的域名长度不一,我就想用批处理按照域名的长度来排序,短的排前面,长的排后面,后面的帐号密码要跟上

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1* delims= " %%a in (a.txt) do (
  3.   set "str=%%a"&set n=0
  4.   call :lp
  5.   set ".!n!!str!=!str! %%b"
  6. )
  7. (for /f "tokens=2 delims==" %%a in ('set.') do echo %%a)>b.txt
  8. goto :eof
  9. :lp
  10. if not "!str:~%n%!"=="" set/a n+=1&goto :lp
复制代码
不考虑特殊字符的情况下

TOP

另外还有个办法:
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /l %%a in (1 1 50) do (
  3.    set key=!key!.
  4.   findstr /x "!key!" a.txt
  5. ))>b.txt
复制代码
效率比较低,而且需确定最长行长度,但是写起来比较快,适合手上没有现成参考代码,且文本行比较短的情况

TOP

本帖最后由 CrLf 于 2012-4-5 18:09 编辑

好吧,我调用函数上瘾了,默认右对齐排序,即优先按长度排序,等长度的情况再按字符顺序排序:
  1. @echo off
  2. call :order a.txt>b.txt
  3. pause&exit
  4. ::::::::::::::::::::::::::::::::排序:::::::::::::::::::::::::::::::::
  5. :: call :order [/q] [/r] [/l] Str1/File1 Str2/File2 ... StrN/FileN ::
  6. ::                                                                 ::
  7. ::    稳定兼容模式(默认):                                       ::
  8. ::      [稳定兼容模式,默认模式,兼容所有字符,但效率较低,单条参] ::
  9. ::      [数长数长度上限为1023 个字符。                           ] ::
  10. ::        将输入依次从左至右逐字符比较,不区分宽字符,若将宽字符   ::
  11. ::        算作两个字符,请在调用本函数前使用 chcp 437。当存在与    ::
  12. ::        第当存在与除开关之外的第一个参数的同名文件时认为所有参   ::
  13. ::        数均为文件名,否则将把所有参数作为字符串排序输出。       ::
  14. ::                                                                 ::
  15. ::    缓冲区输入模式:                                             ::
  16. ::      [缓冲区输入模式,任何模式下,当除开关外的参数为空时作为当] ::
  17. ::      [前模式的子模式自动启用,其余特性与父模式基本相同。      ] ::
  18. ::        当参数为空时,则认为输入自管道或重定向,将取当前缓冲区   ::
  19. ::        里所有内容用于排序,该模式易增加耗时。                   ::
  20. ::        注意,如果参数为空,而缓冲区又无任何输入,脚本会卡住。   ::
  21. ::                                                                 ::
  22. :: /q 快速排序模式:                                               ::
  23. ::      [快速排序模式是一个简化的模式,由 /q 开关启用,参数如果含] ::
  24. ::      [有!、=、/或\将得出错误结果,若含有?、*将对文件名进行通配] ::
  25. ::      [匹配,单条参数长度上限 127 字节,不支持对文件排序。     ] ::
  26. ::        将输入的命令行参数按右对齐的字符顺序输出,不区分宽字符。 ::
  27. ::        /q 开关与其他任何模式并用时,将增加排序的耗时。          ::
  28. ::                                                                 ::
  29. :: /r 逆序输出模式                                                 ::
  30. ::      [逆序输出模式:任何情况下由 /r 开关启用,将原结果逆序输出] ::
  31. ::        可与以上任何模式组合,但可能增加耗时。                   ::
  32. ::                                                                 ::
  33. :: /l 左对齐模式                                                   ::
  34. ::      [左对齐模式:任何情况下由 /l 开关启用,将从左至右逐字比较] ::
  35. ::        可与以上任何模式组合,本函数默认右对齐排序,若用 /l 开   ::
  36. ::        关设置为左对齐,可显著提升排序的效率。                   ::
  37. ::                                                                 ::
  38. ::                                                                 ::
  39. ::   各组合的效率参考   ================ 特性说明 ================ ::
  40. ::                                                                 ::
  41. ::      开关    效率        order 函数中除稳定兼容模式和快速排序模 ::
  42. ::    /q  . /l   高     式因为算法思想不同而相斥,其余三个模式均可 ::
  43. ::    /q  .  .   高     与此二者之一自由地排列组合。               ::
  44. ::    /q /r /l   中         由于系统自带的 sort 命令是左对齐排序, ::
  45. ::    /q /r  .   中     所以本函数默认为右对齐,可以使用 /l 开关切 ::
  46. ::     . /r /l   中     换为左对齐,并且能够提升效率。             ::
  47. ::     .  . /l   中         缓冲区输入模式会降低效率,但可接受来自 ::
  48. ::     . /r  .   低     缓冲区的输出(重定向输入或管道输入)。     ::
  49. ::     .  .  .   低         逆序模式将逆序排列,易降低执行效率。   ::
  50. ::                          开启左对齐模式后,效率提高,而且快速排 ::
  51. ::      有参数一般比无  序模式未开启时会改用 sort,此时兼容性最佳  ::
  52. ::  参数快一级,但非简  (支持 65535 字符的行、支持 unicode 编码向 ::
  53. ::  化模式下左对齐排序  gbk 的单向转换)且排序的效率将大幅提升。   ::
  54. ::  时,无参数快一级。                                             ::
  55. ::                       批处理之家 http://bbs.bathome.net   Crlf  ::
  56. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  57. :order [/q] [/r] [/l] Str1/File1 Str2/File2 ... StrN/FileN
  58. @echo off&setlocal enabledelayedexpansion&set q=&set l=&set r=&set @=&set n=%%a#
  59. for %%a in (%*)do if /i %%a==/q (set q=2)else if /i %%a==/r (
  60. set "r=&sort /+1024 /o $ $")else if /i %%a==/l (set l=.)else set @=!@! %%a
  61. if !q!!l!==. (if defined r set r=/r)&if !@!.==. (sort !r! /rec 65535
  62. )else cmd/c"type %%@%%" 2>nul|sort !r! /rec 65535)&exit/b
  63. (cd.>$||taskkill /f /t /im findstr.exe /im sort.exe /im .>nul) 2>nul||cd.>$||exit/b1)
  64. if !@!.==. set "n=/f "tokens=1*delims=:" %%a#'findstr /n .*^|findstr /n .'"
  65. if exist %1 set "n=/f "tokens=1*delims=:" %%a#'findstr .* !@! nul'"
  66. (if !r:~0!!q!==!r! set r=/r)&if !l!.==. for /l %%a in (9 -1 %q%)do set str=!str!!str!/
  67. if defined q (if !@!. neq . (for %%a in (!@:/q^=!)do set "@=%str%%%~a"&set "\!@:~-127!.=#"
  68. )else for /f "eol=\delims=" %%a in ('more')do set "@=%str%%%~a"&set "\!@:~-127!.=#"
  69. set \>$ 2>&1 %r%&endlocal&for /f "delims=" %%a in ($)do echo %%~na)else (
  70. endlocal&setlocal disabledelayedexpansion&(for %n:#= in (%)do (
  71. set /a "n+=100001"&set "str=%%b"&setlocal enabledelayedexpansion
  72. set str=%str%:!str:*:=!&echo !n:~-5!!str:~-1024!&endlocal))>$ 2>&1
  73. sort /rec 1029 /+6 /o $ $ %r%&&for /f "delims=" %%a in ($)do (
  74. set str=%%a&setlocal enabledelayedexpansion&echo;!str:*:=!&endlocal))
  75. del $>nul&if /i %0:%errorlevel% neq order:0 exit/b0
复制代码
其实只是惯常思路,将几种情况整合成一个函数方便按需调用罢了

TOP

返回列表