如何使用批处理脚本按长度对行进行排序?

时间:2014-03-28 19:44:57

标签: sorting batch-file line

我想制作脚本,在文档example.txt中按长度排序所有行(某些行有空格)。最长的行将是第一行,最短的行将在文档的末尾。脚本可以重写原始文档。谢谢: - )

4 个答案:

答案 0 :(得分:3)

通过在临时文件夹中将每一行写为自己的文件,可以非常轻松快捷地完成此任务。然后使用DIR / B / O-S按大小对文件(行)进行排序,使用FOR / F捕获结果,然后使用TYPE打印每个文件(行)。

@echo off
setlocal disableDelayedExpansion

set "file=example.txt"
set "tempLoc=sortLinesTemp"

md "%tempLoc%"
set "cnt=0"
for /f usebackq^ delims^=^ eol^= %%A in ("%file%") do (
  set /a cnt+=1
  set "ln=%%A"
  setlocal enableDelayedExpansion
  echo(!ln!>"%tempLoc%\f!cnt!"
  endlocal
)
(for /f %%F in ('dir /b /o-s "%tempLoc%"') do type "%tempLoc%\%%F")>"%file%.new"
move /y "%file%.new" "%file%" >nul
rd /s /q "%tempLoc%"
type "%file%"

此解决方案将删除空行。可以使用更多代码保留空行。

此外,行长度限制为小于8191个字符。这种限制是任何纯本地批处理解决方案所固有的。

答案 1 :(得分:3)

此批处理文件使用VBS脚本来帮助获取行长度并进行排序,然后将input.txt文件重写为input.new.txt

像这样使用批处理:sortline.bat "filename.txt"

一行中的前导|字符将消失。

@echo off
set "file=%temp%\sortline.vbs"
(
 echo. Const ForReading = 1, ForWriting = 2
 echo. infile = "%~1"
 echo. Set fso = CreateObject("Scripting.FileSystemObject"^)
 echo. Set f1 = fso.OpenTextFile(infile, ForReading^)
 echo. Do While not f1.AtEndOfStream
 echo. f = f1.readline
 echo. Wscript.echo right(10000+len(f^),4^) ^& "|" ^& f
 echo. loop
 echo. f1.close
)>"%file%"
(for /f "tokens=1,* delims=|" %%a in (' cscript //nologo "%file%" ^|sort /r ') do echo(%%b)>"%~n1.new.txt"
del "%file%"

答案 2 :(得分:2)

我认为这是最简单,最快捷的方式:

@echo off
setlocal EnableDelayedExpansion

set /A seqNum=10000, accumLen=0
set "lastLine="
for /F "tokens=1* delims=:" %%a in ('findstr /O "^" example.txt') do (
   if not defined lastLine (
      set "lastLine=%%b"
   ) else (
      set /A "seqNum+=1, thisLen=10000-(%%a-accumLen), accumLen=%%a"
      set "line[!thisLen!!seqNum:~-4!]=!lastLine!"
      set "lastLine=%%b"
   )
)
for %%a in (example.txt) do (
   set /A "seqNum+=1, thisLen=10000-(%%~Za-accumLen)"
   set "line[!thisLen!!seqNum:~-4!]=!lastLine!"
)
(for /F "tokens=1* delims==" %%a in ('set line[') do echo %%b) > sorted.txt

此解决方案从文件中删除空行和感叹号。如果需要,这两个限制都可以修复。

答案 3 :(得分:0)

您需要strLen function from this page。另外,here is a download link下载sortn.bat,它将为您提供入门提示。此外,您需要熟悉基本的比较功能:

public int compare(String o1, String o2) {             
        if (o1.length()!=o2.length()) {
            return o1.length()-o2.length();
        }
        return o1.compareTo(o2);
    }
祝你好运。