我想要一个批处理文件,我可以将一个文本文件拖到其中(最好一次拖多个文本文件(,它将逐行读取每个文本文件,并将每一行添加到指定的目标文本文件中。目标文本文件将不包含任何重复的行,并且将按字母顺序排序。源文件永远不会两次包含同一行,但可能包含非字母数字字符,如:{-:_~!
示例:
a.txt:
apple
banana
garbage carrot
{Elmer Fudd}
b.txt
1 tequila
2 tequila
3 tequila
garbage carrot
{Bugs Bunny}
destination.txt之前:
{daffy duck}
floor
将a.txt和b.txt拖到批处理文件后的destination.txt:
{Bugs Bunny}
{daffy duck}
{Elmer Fudd}
1 tequila
2 tequila
3 tequila
apple
banana
floor
garbage carrot
我已经开始了:
@echo off
setlocal disabledelayedexpansion
set "sourcefile=%~1"
echo "%sourcefile%" > temp.txt
for /f "delims=;" %%F in (%sourcefile%) do (
echo %%F>>temp.txt
)
del /q destination.txt
ren temp.txt destination.txt
它将拖动的文件复制到一个临时文件中,但我不知道如何对其进行排序。sort命令对我不起作用,它只是挂断了程序。感谢所有的帮助。非常感谢。
@echo off
setlocal enabledelayedexpansion
set "prev="
echo "%~1"
copy /y destination.txt+"%~1" temp.txt >nul
(
for /f "delims=" %%F in ('sort temp.txt') do (
if "!prev!" neq "%%F" echo(%%F
set "prev=%%F"
)
)>destination.txt
del temp.txt
应该对你有用(我没有试过(
无需使用for /f
处理新文件-copy a+b c
将a和b连接到c中。如果目标已经存在,/y
将强制覆盖目标。
然后处理每一行,如果这一行与前一行不匹配,则回显从sort
读取的行,但"用引号括起字符串",以便批处理知道如果字符串包含空格或其他分隔符,则将其作为一个单元处理。
(...echo ...)>file
格式(重新(使用echo
ed数据创建文件,而不是将数据发送到屏幕。
如果我理解你的意思,那么这就足够了:
@echo off
:loop
type "%~1" >>"c:destination.txt"
shift
if not "%~1"=="" goto :loop
sort < "c:destination.txt" > "%temp%random file.txt"
move "%temp%random file.txt" "c:destination.txt"
另存为批处理文件。这是一个混合批处理/jscript文件。文件处理/排序在批处理部分完成。然后,调用javascript部分以消除重复的行。
已编辑-为了适应评论
@if (@This==@IsBatch) @then
@echo off
rem **** batch zone *********************************************************
setlocal enableextensions disabledelayedexpansion
rem If there are no files, nothing to do
if "%~1"=="" goto endProcess
rem Configure the output final file
set "outputFile=destination.txt"
if not exist "%outputFile%" >"%outputFile%" break
rem Configure and initialize temporary file
set "tempFile=%temp%%~nx0.%random%%random%.tmp"
find /v "" <"%outputFile%" >"%tempFile%"
rem Iterate over the file list sending output to temporary file and deleting input file
for %%a in (%*) do (
find /v "" <"%%a" >>"%tempFile%"
rem del /q "%%a" 2>nul
)
rem Process temporary file into outpufile, sorting and eliminating duplicates
type "%tempFile%" | sort | cscript //nologo //e:Javascript "%~f0" > "%outputFile%"
rem Cleanup
del /q "%tempFile%" 2>nul
:endProcess
endlocal
exit /b
@end
// **** Javascript zone *****************************************************
var stdin=WScript.StdIn, stdout=WScript.StdOut, previous=null, current;
while (!stdin.AtEndOfStream){
if (previous !== (current=stdin.ReadLine())) stdout.WriteLine(current);
previous = current;
};