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

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

本帖最后由 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,
...

求解。
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2
踏实一些点.不要着急.你想要的时间都会给你.2

  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

评分人数

    • 慕夜蓝化: 你的真心看不懂,那个0x彻底绕晕了。 能解 ...技术 + 1
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

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

评分人数

    • CrLf: awk技术 + 1
    • 慕夜蓝化: 我用的4.2版的 不过结果符和要求技术 + 1

TOP

本帖最后由 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

评分人数

TOP

本帖最后由 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

评分人数

TOP

回复 3# 愤怒的CMD

嗯,确实可以,不过顺序都被打乱了。
踏实一些点.不要着急.你想要的时间都会给你.2

TOP

我这里没有问题。
WIN7 + GNU Awk 4.1.0

TOP

本帖最后由 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

评分人数

TOP

回复 1# 慕夜蓝化
  1. set "l=%%bfedcba9876543210"
  2. set /a len=0x!l:~16,1!
复制代码
用来算每组数字的字符串长度0x表示16进制,例如len=0xe 则len=14
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

回复 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
复制代码
踏实一些点.不要着急.你想要的时间都会给你.2

TOP

回复 5# apang

这是最快的方法...很快,很快,其实之前也见别人用过,但是一直不清楚该在什么条件下使用。
  1. for %%i in ("!s:Replace=" "!") do (
复制代码
不认真看的话,挺晕的。
踏实一些点.不要着急.你想要的时间都会给你.2

TOP

回复 12# 慕夜蓝化


    其实就是为了算出每个数字的个数
假设 s 的值为 112233
把1替换成" ",!s:1=" "! 变成:" "" "2233
两端再加上引号:"!s:1=" "!" 就变成这样了:"" "" "2233"
放到for循环中需要循环3次,就算出数字1的个数为2了

TOP

回复 13# apang

嗯,记下了,这样来讲清楚了好多。
踏实一些点.不要着急.你想要的时间都会给你.2

TOP

表驱动法,长了点:
  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
复制代码

TOP

返回列表