Board logo

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

作者: 慕夜蓝化    时间: 2015-3-3 09:12     标题: [已解决]批处理将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,
...

求解。
作者: xxpinqz    时间: 2015-3-3 11:31

  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
复制代码

作者: 愤怒的CMD    时间: 2015-3-3 11:40

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
作者: apang    时间: 2015-3-3 12:42

本帖最后由 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
复制代码

作者: apang    时间: 2015-3-3 12:58

本帖最后由 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)
复制代码

作者: 慕夜蓝化    时间: 2015-3-3 15:11

回复 3# 愤怒的CMD

嗯,确实可以,不过顺序都被打乱了。
作者: 愤怒的CMD    时间: 2015-3-3 15:52

我这里没有问题。
WIN7 + GNU Awk 4.1.0
作者: pcl_test    时间: 2015-3-3 17:51

本帖最后由 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
复制代码

作者: xxpinqz    时间: 2015-3-6 10:14

回复 1# 慕夜蓝化
  1. set "l=%%bfedcba9876543210"
  2. set /a len=0x!l:~16,1!
复制代码
用来算每组数字的字符串长度0x表示16进制,例如len=0xe 则len=14
作者: 慕夜蓝化    时间: 2015-3-6 13:44

回复 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

回复 5# apang

这是最快的方法...很快,很快,其实之前也见别人用过,但是一直不清楚该在什么条件下使用。
  1. for %%i in ("!s:Replace=" "!") do (
复制代码
不认真看的话,挺晕的。
作者: apang    时间: 2015-3-9 18:56

回复 12# 慕夜蓝化


    其实就是为了算出每个数字的个数
假设 s 的值为 112233
把1替换成" ",!s:1=" "! 变成:" "" "2233
两端再加上引号:"!s:1=" "!" 就变成这样了:"" "" "2233"
放到for循环中需要循环3次,就算出数字1的个数为2了
作者: 慕夜蓝化    时间: 2015-3-9 19:57

回复 13# apang

嗯,记下了,这样来讲清楚了好多。
作者: CrLf    时间: 2015-3-9 20:41

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





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2