请帮我看看如何在 Windows 中使用批处理反转/排序文本文件中的行?
例如:
我有这种格式的文本
15/04/2013-07:10:30 lalala
15/04/2013-07:10:30 文本 text
15/04/2013-07:10:30 1 lala 文本
15/04/2013-07:10:36 8 文本 lala X
15/04/2013-07:10:36 A 文本 lala 1
17/04/2013-10:11:12 B bext lala 4
... (其他行)
我需要将其反转为这种格式
17/04/2013-10:11:12 B bext lala 4
15/04/2013-07:10:36 A text lala 1
15/04/2013-07:10:36 8 text lala X
15/04/2013-07:10:30 1 lala Text
15/04/2013-07:10:30 Text text
15/04/2013-07:10:30 lalala
... (其他行)
感谢您的帮助!
答案1
这可能不是最漂亮的方法,但它很简单并且可以按您想要的方式工作。
echo. > output.txt
for /f "delims=@" %%j in (yourfile.txt) do (
type output.txt > tmp
echo %%j > output.txt
type tmp >> output.txt
)
del tmp
如果您要处理大文件,请不要使用上述示例。这确实是一个耗时耗力的解决方案。这里有我刚刚准备的更快版本:
setlocal enabledelayedexpansion
set I=0
for /F "tokens=*" %%k in (yourfile.txt) do (
set /A I=!I! + 1
set LINE!I!=%%k
)
for /L %%c in (!I!,-1,1) do (
echo !LINE%%c! >> out.txt
)
在我的计算机上,逆向 40kb 文件(10k 行,每行 1 个字符)大约需要 1 分钟。请记住,这仍然只是批处理。有许多更好的脚本或编程语言可以更好地执行该操作。
答案2
perl -e "print reverse <>" file > file_reversed
请注意,在 Windows 上,您必须使用双引号而不是单引号来分隔 perl 字符串。
答案3
我想我会将其添加为第二种方法,因为它可能对某些人更有效:
如果您愿意接受某些可以调用的东西,而不是批处理逻辑:
这是一个 .NET 应用程序将其放到 %Systemroot% 并像批处理、.bat、.cmd 等中的任何其他命令一样调用它。1
用法如下:逆向“C:\Path\File.txt”
是的,我拥有这个东西。对我来说,调用它比写出逻辑更容易。它将替换文件内容,至少目前如此,并且不会创建第二个文件。
答案4
正好 10 行 perl,考虑到如果输出文件已经存在则什么也不会做:
#!/usr/bin/perl
usage() if( !$ARGV[0] );
my $f_out = my $f_in = $ARGV[0];
$f_out =~ s/(\..{1,3})?$/.reverse$1/i;
open(TXTIN, "<$f_in") || usage("Can't read file [$f_in]");
my @in = <TXTIN>; close(TXTIN);
usage( "File already exists, nothing done [$f_out]" ) if( -e $f_out );
open(TXTOUT, ">$f_out"); print TXTOUT join( '', reverse( @in ) ); close(TXTOUT);
print "File reverse written [$f_out]\n";
sub usage { print "$_[0]\nUsage: [perl] rev2.pl (filename)\n"; exit; }