标题: [文本处理] 批处理如何实现将文本内容根据指定列的数字大小排序 [打印本页]
作者: lbfly90 时间: 2014-2-20 11:53 标题: 批处理如何实现将文本内容根据指定列的数字大小排序
本帖最后由 pcl_test 于 2016-8-6 18:43 编辑
批处理如何实现文本内容按指定列排序?
有一个a.txt文本类似是这样的
李明 5 02-07 20:30
张伟 3 02-07 20:31
刘欣 1 02-07 21:06
王娇娇 8 02-07 21:02
赵四 2 02-07 22:39
要求文本内容按照第二列的数字由大到小排列,生成下面b.txt的样子。
王娇娇 8 02-07 21:02
李明 5 02-07 20:30
张伟 3 02-07 20:31
赵四 2 02-07 22:39
刘欣 1 02-07 21:06
作者: terse 时间: 2014-2-20 12:19
本帖最后由 terse 于 2014-2-20 12:21 编辑
第一列没空格的话 试试这样- @echo off
- %~1 (for /f "tokens=1*" %%i in ('%~s0 : ^|sort /r') do echo;%%j)>b.txt&exit
- setlocal enabledelayedexpansion
- for /f "tokens=1,2*" %%a in (a.txt) do set str=0000000%%b&echo !str:~-8! %%a %%b %%c
复制代码
作者: xxpinqz 时间: 2014-2-20 12:32
本帖最后由 xxpinqz 于 2014-2-20 12:34 编辑
- @echo off&setlocal enabledelayedexpansion
- %1(for /f "tokens=1*" %%a in ('%~0 :^|sort /r^|more /t8') do echo,%%b)&pause&exit
- for /f "delims=U" %%a in ('cmd /u /c echo 唉') do set "tab=%%a"
- for /f "tokens=1-2*" %%a in (1.txt) do (
- set ".=00000%%b"
- echo,!.:~-5! %%a%tab%%%b %%c
- )
复制代码
撞车了。。。。。
作者: lbfly90 时间: 2014-2-20 12:42
回复 2# terse
生成的b.txt里面是空的
作者: lbfly90 时间: 2014-2-20 12:44
回复 3# xxpinqz
成功了,能不能讲讲这段代码,初学bat,我还很菜。
作者: xxpinqz 时间: 2014-2-20 12:55
本帖最后由 xxpinqz 于 2014-2-20 12:57 编辑
回复 5# lbfly90
这两个代码是一样的,你是不是测试有误。
原理都是取第二列的值补0后倒序输出(sort /r)
单独运行下:- @echo off
- setlocal enabledelayedexpansion
- for /f "tokens=1,2*" %%a in (a.txt) do set str=0000000%%b&echo !str:~-8! %%a %%b %%c
- pause
复制代码
第二行代码解释:
http://www.bathome.net/thread-28866-1-1.html
作者: terse 时间: 2014-2-20 12:57
本帖最后由 terse 于 2014-2-20 12:58 编辑
回复 4# lbfly90
我这里测试可行的 其实代码和xxpinqz的流程 一样 为什么会空呢
检查一下文件名吧
作者: lbfly90 时间: 2014-2-20 13:02
回复 7# terse
刚才又试了一下,成功了,可能是我copy的有问题,非常感谢。
作者: lbfly90 时间: 2014-2-20 22:56
回复 6# xxpinqz
set str=0000000%%b&echo !str:~-8!
这句能不能解释一下?
作者: zhanglei1371 时间: 2014-2-21 10:14
回复 6# xxpinqz
能否详细解释下这两句:
%1(for /f "tokens=1*" %%a in ('%~0 :^|sort /r^|more /t8') do echo,%%b)&pause&exit
for /f "delims=U" %%a in ('cmd /u /c echo 唉') do set "tab=%%a"
据我测试,%~0 :似乎代表了echo的内容,阿胖只是解释了%1 cmd/k %0 :,但对于这段代码%1(for /f "tokens=1*" %%a in ('%~0 :^|sort /r^|more /t8')并未解释。
其实我还是不太理解,只是不好意思追问了
另外,for /f "delims=U" %%a in ('cmd /u /c echo 唉') do set "tab=%%a"这句用意何在?还请指教
对LZ问题的解释:
set str=0000000%%b&echo !str:~-8!
排序时,100会比2小,如下:
100
2
故需要对其位数,加0来实现:
100
002
这样就能实现100比2大了。set str=0000000%%b&echo !str:~-8!如果前面加了2个0后面就是echo !str:~-3!
作者: Batcher 时间: 2014-2-21 13:27
回复 9# lbfly90
先在字符串的左侧添加几个0
然后取字符串的后8位
目的是把不够8位的凑够8位
作者: xxpinqz 时间: 2014-2-21 13:55
回复 10# zhanglei1371
tab的参考http://www.bathome.net/thread-12347-1-1.html
sort /r对输出结果反序排列
more /t8 把制表符TAB键扩展为8个空格,实际作用用来对齐名字和后面的字符串。(more /?)
这里多余了,默认是8,写的时候没注意。
作者: DAIC 时间: 2014-2-21 14:31
如果你有 GNU 的 sort.exe- sort.exe -k2,2nr a.txt > b.txt
复制代码
作者: lbfly90 时间: 2014-2-24 21:40
回复 2# terse
如果想把这段作为子程序该怎么写啊?
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |