Board logo

标题: [文本处理] 批处理如何实现将文本内容根据指定列的数字大小排序 [打印本页]

作者: 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 编辑

第一列没空格的话 试试这样
  1. @echo off
  2. %~1 (for /f "tokens=1*" %%i in ('%~s0 : ^|sort /r') do echo;%%j)>b.txt&exit
  3. setlocal enabledelayedexpansion
  4. 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 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. %1(for /f "tokens=1*" %%a in ('%~0 :^|sort /r^|more /t8') do echo,%%b)&pause&exit
  3. for /f "delims=U" %%a in ('cmd /u /c echo 唉') do set "tab=%%a"
  4. for /f "tokens=1-2*" %%a in (1.txt) do (
  5.     set ".=00000%%b"
  6.     echo,!.:~-5! %%a%tab%%%b %%c
  7. )
复制代码
撞车了。。。。。
作者: 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)

单独运行下:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1,2*" %%a in (a.txt) do set str=0000000%%b&echo !str:~-8! %%a %%b %%c
  4. 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
  1. sort.exe -k2,2nr a.txt > b.txt
复制代码

作者: lbfly90    时间: 2014-2-24 21:40

回复 2# terse


    如果想把这段作为子程序该怎么写啊?




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