标题: [文本处理] [已解决]批处理将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
- @echo off
- set n=10000
- (for /f "delims=" %%a in (a.txt) do (
- setlocal enabledelayedexpansion
- for %%b in (%%a) do (
- set "str=%%b"
- set "l=%%bfedcba9876543210"
- set /a len=0x!l:~16,1!
- for %%c in (!len!) do (
- for /l %%a in (0,1,%%c) do set #!n!#!str:~%%a,1!#!random!=.
- set/an+=1
- )
- set #!n!#, #=.
- )
- for /f "tokens=2 delims=#" %%d in ('set #') do set "s=!s!%%d"
- echo,!s!
- endlocal
- ))>b.txt
复制代码
作者: 愤怒的CMD 时间: 2015-3-3 11:40
awk.awk中的内容:- BEGIN{
- }
- {
- split($0,a," ")
- for(i in a)
- {
- split(a[i],b,"")
- t=asort(b)
- for(n=0;n++<=t;)
- printf b[n]
- printf " "
- }
- print ""
- }
复制代码
CMD下输入:gawk -f awk.awk a.txt
作者: apang 时间: 2015-3-3 12:42
本帖最后由 apang 于 2015-3-4 18:46 编辑
- @echo off & setlocal enabledelayedexpansion
- for /f "delims=" %%i in (a.txt) do (
- for %%a in (%%i) do (
- set "s=%%a"
- set "s1="
- for /l %%b in (0 1 9) do (
- set n=-1
- for %%c in ("!s:%%b=" "!") do set /a n+=1
- for /l %%c in (1 1 !n!) do set "s1=!s1!%%b"
- )
- set /p=!s1!,<nul
- )
- echo,
- )
- pause
复制代码
发现可以简化:- @echo off & setlocal enabledelayedexpansion
- for /f "delims=" %%i in (a.txt) do (
- for %%a in (%%i) do (
- set "s=%%a"
- set "s1="
- for /l %%b in (0 1 9) do (
- for %%c in ("!s:%%b=" "!") do set "s1=!s1!%%b"
- set "s1=!s1:~,-1!"
- )
- set /p=!s1!,<nul
- )
- echo,
- )
- pause
复制代码
作者: apang 时间: 2015-3-3 12:58
本帖最后由 apang 于 2015-3-3 13:09 编辑
- @set @n=0;//&cscript -nologo -e:jscript "%~0"<a.txt>b.txt & pause&exit
-
- s = WScript.StdIn.ReadAll();
- s = s.replace(/(\d+)( +)?/g,
- function(s0,s1){return s1.match(/\d/g).sort().join("") + ","}
- )
- 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# 慕夜蓝化 - @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%a in (a.txt) do (
- set t=
- for %%b in (%%a) do (
- set "str=%%b"
- for /l %%c in (0 1 20) do (
- >>$1 echo,!str:~%%c,1!
- rem if "!str:~%%c,1!" == "" goto :eof 不晓得怎么跳出导致效率慢了
- )
- set s=
- for /f "delims=" %%d in ('sort $1') do set s=!s!%%d
- set t=!t!!s!,
- del $1
- )
- >>$ echo,!t!
- )
- move $ a.txt
- pause
复制代码
作者: xxpinqz 时间: 2015-3-6 10:14
回复 1# 慕夜蓝化 - set "l=%%bfedcba9876543210"
- set /a len=0x!l:~16,1!
复制代码
用来算每组数字的字符串长度0x表示16进制,例如len=0xe 则len=14
作者: 慕夜蓝化 时间: 2015-3-6 13:44
回复 10# xxpinqz
嗯嗯,我自已之前也根据这个问题写了一个两个解法,但是速度太慢了。
同样需要计算它的长度。
但很糟糕,用的是findstr /o 的计算方式。
包括你后来的set列举的手法,都很有见地,受益非浅。- @echo off
- for /f "delims=" %%i in (a.txt) do (
- for %%a in (%%i) do (
- setlocal enabledelayedexpansion
- set "str=%%a"&set/a a=9
- for /f "delims=:" %%b in ('(echo,!str!^&echo,^)^|findstr /o "."') do set/a n=%%b-3
- for /l %%c in (0 1 !n!) do set/a a+=1&set @!a!=!str:~%%c,1!
- for /f "tokens=2 delims==" %%d in ('set @^|sort /+5') do set v=!v!%%d
- set/p=!v!, <nul&endLocal
- )
- echo,
- )
- pause
复制代码
作者: 慕夜蓝化 时间: 2015-3-8 15:08
回复 5# apang
这是最快的方法...很快,很快,其实之前也见别人用过,但是一直不清楚该在什么条件下使用。- 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
表驱动法,长了点:- @echo off&setlocal enabledelayedexpansion
- for /l %%a in (0 1 9) do for /l %%b in (6 -1) do set [%%a]=![%%a]!![%%a]!%%a
-
- for /f "delims=" %%a in (123.txt) do (
- set "line="
-
- for %%b in (%%a) do (
- set/a len=0&set "str=%%b$"
- for %%z in (64,32,16,8,4,2,1) do (
- if not "!str:~%%z!"=="" set/a len+=%%z&set str=!str:~%%z!
- )
-
- set "str=%%b"
- for %%z in (!len!) do (
- for /l %%c in (9 -1) do (
- set str=![%%c]!!str:%%c=!
- set str=!str:~-%%z!
- )
- )
-
- set line=!line!,!str!
- )
-
- echo !line:~1!
- )
- pause
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |