[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

本帖最后由 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: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
复制代码

TOP

本帖最后由 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. )
复制代码
撞车了。。。。。
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

回复 2# terse


    生成的b.txt里面是空的

TOP

回复 3# xxpinqz


    成功了,能不能讲讲这段代码,初学bat,我还很菜。

TOP

本帖最后由 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
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

本帖最后由 terse 于 2014-2-20 12:58 编辑

回复 4# lbfly90
我这里测试可行的 其实代码和xxpinqz的流程 一样 为什么会空呢
检查一下文件名吧

TOP

回复 7# terse


    刚才又试了一下,成功了,可能是我copy的有问题,非常感谢。

TOP

回复 6# xxpinqz


    set str=0000000%%b&echo !str:~-8!
这句能不能解释一下?

TOP

回复 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!

TOP

回复 9# lbfly90


先在字符串的左侧添加几个0
然后取字符串的后8位
目的是把不够8位的凑够8位
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 10# zhanglei1371
tab的参考
http://www.bathome.net/thread-12347-1-1.html

sort /r对输出结果反序排列
more /t8 把制表符TAB键扩展为8个空格,实际作用用来对齐名字和后面的字符串。(more /?)
这里多余了,默认是8,写的时候没注意。
初学BAT,非专业。代码不适当之处还望前辈们多多指点。在此表示感谢!

TOP

如果你有 GNU 的 sort.exe
  1. sort.exe -k2,2nr a.txt > b.txt
复制代码

TOP

回复 2# terse


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

TOP

返回列表