Board logo

标题: [文本处理] [已解决]批处理文本乱序重排的疑惑 [打印本页]

作者: kofbld    时间: 2015-3-2 20:42     标题: [已解决]批处理文本乱序重排的疑惑

本帖最后由 kofbld 于 2015-3-3 21:21 编辑
  1. @echo off
  2.     if "%1" neq "$" (
  3.     for /f "tokens=2 delims=#" %%a in ('"%~0" $^|sort') do echo %%a
  4.     pause>nul
  5.     ) 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
  1. @echo off
  2. if "%1" neq "$" (
  3. for /f "tokens=2 delims=#" %%a in ('"%~0" $^|sort') do echo %%a >>result.txt
  4. pause
  5. ) 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
  1. @echo off&setlocal enabledelayedexpansion
  2. if "%1" neq "$" (
  3.     (for /f "tokens=2 delims=#" %%a in ('%0 $^|sort') do echo %%a)>result.txt
  4.     pause
  5. ) 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
还不如这么写
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "delims=" %%i in (test.txt) do echo !random:~-1!!random:~-1!#%%i)>$
  3. (for /f "tokens=2 delims=#" %%a in ('sort $') do echo %%a)>result.txt
  4. del $
  5. pause
复制代码

作者: pcl_test    时间: 2015-3-2 22:09

本帖最后由 pcl_test 于 2015-3-2 22:13 编辑

回复 4# kofbld
递归容易绕晕,代码可以写成5楼cobat的,这样容易理解
  1. @echo off
  2. for /f "delims=" %%i in (test.txt) do call echo %%random:~-1%%%%random:~-1%% #%%i >>1.txt
  3. ::%random%返回一个0~32767之间的随机整数,%random:~-1%截取%random%返回的随机整数的最后一位,也就是0~9的其中一个
  4. ::%random:~-1%%random:~-1%,组合返回一个00~99之间的随机整数,因为for,用call开启变量延迟,要用%%random%%
  5. ::整句就是在test.txt每行行头添加一个00~99之间的随机整数,并用空格和#与原来的内容分隔,查看1.txt
  6. for /f "tokens=2 delims=#" %%a in ('type "1.txt" ^|sort') do echo %%a >>result.txt
  7. ::type "1.txt" ^|sort显示1.txt的内容并以每行的第一个字符为主以从0至9的顺序重新排序,|的作用是将第一条命令的结果作为第二条命令的参数来使用,^是转义符
  8. ::type "1.txt" ^|sort也可以直接用sort "1.txt"
  9. ::delims=#的作用就是以空格和#作为分隔符,将排序好的内容分成“两位数字+原来的内容”两部分,tokens=2表示取第二部分,也就是原来的内容,改成tokens=1,则是取两位数字
  10. 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