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

[文本处理] [已解决]批处理将txt文本内每段数字的每一位数字按大小排序

[复制链接]
发表于 2015-3-3 09:12:41 | 显示全部楼层 |阅读模式
本帖最后由 pcl_test 于 2016-7-12 16:33 编辑

现有一a.txt:
587 263 106 30655 8799 239277
18937066188 18137052119 13937082119
18571266838 18252119017 15380992871
...
要求如下:
b.txt
578, 236, 016, 03556, 7899, 223779,
01136678889, 01111235789, 01112337899,
11235667888, 01111225789, 01123578899,
...

求解。

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2015-3-3 11:31:17 | 显示全部楼层

  1. @echo off
  2. set n=10000
  3. (for /f "delims=" %%a in (a.txt) do (
  4.     setlocal enabledelayedexpansion
  5.     for %%b in (%%a) do (
  6.          set "str=%%b"
  7.          set "l=%%bfedcba9876543210"
  8.          set /a len=0x!l:~16,1!
  9.          for %%c in (!len!) do (
  10.              for /l %%a in (0,1,%%c) do set #!n!#!str:~%%a,1!#!random!=.
  11.              set/an+=1
  12.          )
  13.          set #!n!#, #=.
  14.     )
  15.     for /f "tokens=2 delims=#" %%d in ('set #') do set "s=!s!%%d"
  16.     echo,!s!
  17.     endlocal
  18. ))>b.txt
复制代码

评分

参与人数 1技术 +1 收起 理由
慕夜蓝化 + 1 你的真心看不懂,那个0x彻底绕晕了。 能解 ...

查看全部评分

发表于 2015-3-3 11:40:15 | 显示全部楼层
awk.awk中的内容:
  1. BEGIN{
  2. }
  3.      {
  4.           split($0,a," ")
  5.           for(i in a)
  6.               {
  7.                   split(a[i],b,"")
  8.                   t=asort(b)
  9.                   for(n=0;n++<=t;)
  10.                   printf b[n]
  11.                   printf " "
  12.          }
  13.          print ""
  14. }
复制代码
CMD下输入:gawk -f awk.awk a.txt

评分

参与人数 2技术 +2 收起 理由
CrLf + 1 awk
慕夜蓝化 + 1 我用的4.2版的 不过结果符和要求

查看全部评分

发表于 2015-3-3 12:42:21 | 显示全部楼层
本帖最后由 apang 于 2015-3-4 18:46 编辑
  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (a.txt) do (
  3.         for %%a in (%%i) do (
  4.                 set "s=%%a"
  5.                 set "s1="
  6.                 for /l %%b in (0 1 9) do (
  7.                         set n=-1
  8.                         for %%c in ("!s:%%b=" "!") do set /a n+=1
  9.                         for /l %%c in (1 1 !n!) do set "s1=!s1!%%b"
  10.                 )
  11.                 set /p=!s1!,<nul
  12.         )
  13.         echo,
  14. )
  15. pause
复制代码
发现可以简化:
  1. @echo off & setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in (a.txt) do (
  3.         for %%a in (%%i) do (
  4.                 set "s=%%a"
  5.                 set "s1="
  6.                 for /l %%b in (0 1 9) do (
  7.                         for %%c in ("!s:%%b=" "!") do set "s1=!s1!%%b"
  8.                         set "s1=!s1:~,-1!"
  9.                 )
  10.                 set /p=!s1!,<nul
  11.         )
  12.         echo,
  13. )
  14. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
慕夜蓝化 + 1 .....

查看全部评分

发表于 2015-3-3 12:58:51 | 显示全部楼层
本帖最后由 apang 于 2015-3-3 13:09 编辑
  1. @set @n=0;//&cscript -nologo -e:jscript "%~0"<a.txt>b.txt & pause&exit

  2. s = WScript.StdIn.ReadAll();
  3. s = s.replace(/(\d+)( +)?/g,
  4.         function(s0,s1){return s1.match(/\d/g).sort().join("") + ","}
  5. )
  6. WScript.Echo(s)
复制代码

评分

参与人数 1技术 +1 收起 理由
慕夜蓝化 + 1 嗯嗯

查看全部评分

 楼主| 发表于 2015-3-3 15:11:59 | 显示全部楼层
回复 3# 愤怒的CMD

嗯,确实可以,不过顺序都被打乱了。
发表于 2015-3-3 15:52:44 | 显示全部楼层
我这里没有问题。
WIN7 + GNU Awk 4.1.0
发表于 2015-3-3 17:51:49 | 显示全部楼层
本帖最后由 pcl_test 于 2015-3-3 18:03 编辑

回复 1# 慕夜蓝化

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in (a.txt) do (
  4. set t=
  5. for %%b in (%%a) do (
  6. set "str=%%b"
  7. for /l %%c in (0 1 20) do (
  8. >>$1 echo,!str:~%%c,1!
  9. rem if "!str:~%%c,1!" == "" goto :eof 不晓得怎么跳出导致效率慢了
  10. )
  11. set s=
  12. for /f "delims=" %%d in ('sort $1') do set s=!s!%%d
  13. set t=!t!!s!,
  14. del $1
  15. )
  16. >>$ echo,!t!
  17. )
  18. move $ a.txt
  19. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
慕夜蓝化 + 1 不,已经很快了

查看全部评分

发表于 2015-3-6 10:14:48 | 显示全部楼层
回复 1# 慕夜蓝化
  1. set "l=%%bfedcba9876543210"
  2. set /a len=0x!l:~16,1!
复制代码
用来算每组数字的字符串长度0x表示16进制,例如len=0xe 则len=14
 楼主| 发表于 2015-3-6 13:44:48 | 显示全部楼层
回复 10# xxpinqz


    嗯嗯,我自已之前也根据这个问题写了一个两个解法,但是速度太慢了。
同样需要计算它的长度。
但很糟糕,用的是findstr /o 的计算方式。
包括你后来的set列举的手法,都很有见地,受益非浅。

  1. @echo off
  2. for /f "delims=" %%i in (a.txt) do (
  3.     for %%a in (%%i) do (
  4.         setlocal enabledelayedexpansion
  5.         set "str=%%a"&set/a a=9
  6.         for /f "delims=:" %%b in ('(echo,!str!^&echo,^)^|findstr /o "."') do set/a n=%%b-3
  7.         for /l %%c in (0 1 !n!) do set/a a+=1&set @!a!=!str:~%%c,1!
  8.         for /f "tokens=2 delims==" %%d in ('set @^|sort /+5') do set v=!v!%%d
  9.         set/p=!v!, <nul&endLocal
  10.     )
  11.     echo,
  12. )
  13. pause
复制代码
 楼主| 发表于 2015-3-8 15:08:07 | 显示全部楼层
回复 5# apang

这是最快的方法...很快,很快,其实之前也见别人用过,但是一直不清楚该在什么条件下使用。

  1. for %%i in ("!s:Replace=" "!") do (
复制代码
不认真看的话,挺晕的。
发表于 2015-3-9 18:56:59 | 显示全部楼层
回复 12# 慕夜蓝化


    其实就是为了算出每个数字的个数
假设 s 的值为 112233
把1替换成" ",!s:1=" "! 变成:" "" "2233
两端再加上引号:"!s:1=" "!" 就变成这样了:"" "" "2233"
放到for循环中需要循环3次,就算出数字1的个数为2了
 楼主| 发表于 2015-3-9 19:57:13 | 显示全部楼层
回复 13# apang

嗯,记下了,这样来讲清楚了好多。
发表于 2015-3-9 20:41:22 | 显示全部楼层
表驱动法,长了点:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (0 1 9) do for /l %%b in (6 -1) do set [%%a]=![%%a]!![%%a]!%%a

  3. for /f "delims=" %%a in (123.txt) do (
  4.         set "line="

  5.         for %%b in (%%a) do (
  6.                 set/a len=0&set "str=%%b$"
  7.                 for %%z in (64,32,16,8,4,2,1) do (
  8.                         if not "!str:~%%z!"=="" set/a len+=%%z&set str=!str:~%%z!
  9.                 )

  10.                 set "str=%%b"
  11.                 for %%z in (!len!) do (
  12.                         for /l %%c in (9 -1) do (
  13.                                 set str=![%%c]!!str:%%c=!
  14.                                 set str=!str:~-%%z!
  15.                         )
  16.                 )

  17.                 set line=!line!,!str!
  18.         )

  19.         echo !line:~1!
  20. )
  21. pause
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-21 07:51 , Processed in 0.028994 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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