标题: [文本处理] [已解决]批处理文本乱序重排的疑惑 [打印本页]
作者: kofbld 时间: 2015-3-2 20:42 标题: [已解决]批处理文本乱序重排的疑惑
本帖最后由 kofbld 于 2015-3-3 21:21 编辑
- @echo off
- if "%1" neq "$" (
- for /f "tokens=2 delims=#" %%a in ('"%~0" $^|sort') do echo %%a
- pause>nul
- ) else for /f "delims=" %%i in (test.txt) do call echo %%random:~-1%%%%random:~-1%% #%%i
复制代码
test.txt内容如下:
test0001
test0002
……
test00050
以上代码能实现排序,但是没法保存在新文本中,我试了在最后面加 >>result.txt没反应。
哪个朋友有耐心讲解下代码吧!
我主要不懂的有:
('"%~0" $^|sort')
do call echo %%random:~-1%%%%random:~-1%% #%%i
作者: pcl_test 时间: 2015-3-2 21:02
回复 1# kofbld - @echo off
- if "%1" neq "$" (
- for /f "tokens=2 delims=#" %%a in ('"%~0" $^|sort') do echo %%a >>result.txt
- pause
- ) else for /f "delims=" %%i in (test.txt) do call echo %%random:~-1%%%%random:~-1%% #%%i
复制代码
作者: cobat 时间: 2015-3-2 21:22
本帖最后由 cobat 于 2015-3-2 21:51 编辑
就是递归传递参数$ 看这帖http://bbs.bathome.net/thread-1264-1-7.html- @echo off&setlocal enabledelayedexpansion
- if "%1" neq "$" (
- (for /f "tokens=2 delims=#" %%a in ('%0 $^|sort') do echo %%a)>result.txt
- pause
- ) else for /f "delims=" %%i in (test.txt) do echo !random:~-1!!random:~-1!#%%i
复制代码
作者: kofbld 时间: 2015-3-2 21:40
3楼的谢谢啊!我会好好看的
作者: cobat 时间: 2015-3-2 21:49
本帖最后由 cobat 于 2015-3-2 22:00 编辑
回复 4# kofbld
还不如这么写- @echo off&setlocal enabledelayedexpansion
- (for /f "delims=" %%i in (test.txt) do echo !random:~-1!!random:~-1!#%%i)>$
- (for /f "tokens=2 delims=#" %%a in ('sort $') do echo %%a)>result.txt
- del $
- pause
复制代码
作者: pcl_test 时间: 2015-3-2 22:09
本帖最后由 pcl_test 于 2015-3-2 22:13 编辑
回复 4# kofbld
递归容易绕晕,代码可以写成5楼cobat的,这样容易理解- @echo off
- for /f "delims=" %%i in (test.txt) do call echo %%random:~-1%%%%random:~-1%% #%%i >>1.txt
- ::%random%返回一个0~32767之间的随机整数,%random:~-1%截取%random%返回的随机整数的最后一位,也就是0~9的其中一个
- ::%random:~-1%%random:~-1%,组合返回一个00~99之间的随机整数,因为for,用call开启变量延迟,要用%%random%%
- ::整句就是在test.txt每行行头添加一个00~99之间的随机整数,并用空格和#与原来的内容分隔,查看1.txt
- for /f "tokens=2 delims=#" %%a in ('type "1.txt" ^|sort') do echo %%a >>result.txt
- ::type "1.txt" ^|sort显示1.txt的内容并以每行的第一个字符为主以从0至9的顺序重新排序,|的作用是将第一条命令的结果作为第二条命令的参数来使用,^是转义符
- ::type "1.txt" ^|sort也可以直接用sort "1.txt"
- ::delims=#的作用就是以空格和#作为分隔符,将排序好的内容分成“两位数字+原来的内容”两部分,tokens=2表示取第二部分,也就是原来的内容,改成tokens=1,则是取两位数字
- pause
复制代码
作者: cobat 时间: 2015-3-2 22:16
回复 6# pcl_test
递归效率也低
作者: yiwuyun 时间: 2015-3-3 08:16
感觉不像真正的递归,递归是对子过程和函数的调用,这个代码是对文件的二次调用。或者说是重入吧。用得最多的就是BJ混排。代码第一次进入的时候是用随机变量构造test.txt中的乱行。第二次进入的时候是对乱行进行排序,实际就是打乱行。sort的输入来自第一次调用的输出。没运行过代码,可能存在不对的理解。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |