我想循环浏览一个包含文本文件的文件夹并将它们放在一起。
当它们合并时,我想删除重复项并对它们进行排序。
如何使用批处理脚本完成此操作?
答案 0 :(得分:2)
只要目标文件名与通配符规范不匹配,最简单的方法就是这样:
copy /b file?.txt new_file.txt
/b
表示以“二进制”模式复制。否则默认值为/a
,它将停止在Ctrl+Z
复制任何源文件,并在文件末尾附加Ctrl+Z
。
如果如下面的评论所示,有人担心一个或多个文件可能无法正确结束CRLF,那么另一种解决方案就是
(for %i in (file?.txt) do type %i)>new_file.txt
如果文件名包含空格或其他奇数字符,您可能需要引用它们,如下所示:
(for %i in (*.txt) do type "%i")>new_file.txt
但这只是答案的一部分。要删除唯一名称,有几种解决方案只使用批处理文件,或使用powershell,但最简单的方法是获取GnuWin32排序实用程序。它可以从SourceForge获得。然后答案变得简单:
(for %i in (*.txt) do type "%i")|sort -u|>new_file.txt
这样做的另一个好处是GNU排序是一个非常有用的实用程序。
答案 1 :(得分:1)
补充lavinio答案,以履行OP要求“删除重复项并对其进行排序”, 连接文件后,使用powershell sort和get-unique命令
gc allfiles.txt | sort | get-unique > allfiles.txt
答案 2 :(得分:1)
如果某些文件中的最后一行未通过换行符终止,Lavinio的解决方案将无法正常工作。
这是一个简单的命令(不需要批处理),即使最后一行没有通过换行符终止,它也能安全地连接所有文件。如果从批处理文件中运行,则将百分比加倍。
>merged.tmp (for %F in (*.txt) do type "%F")
如果您想排序和删除重复的行,那么PA有一个PowerShell解决方案。这是一个批处理解决方案,可以排序和删除重复的行。请注意,SORT在批处理中不区分大小写,因此重复删除也不区分大小写。
@echo off
setlocal disableDelayedExpansion
>merged.tmp (for %%F in (*.txt) do type "%%F")
sort /rec 8192 merged.tmp /o merged.tmp2
>merged.txt (
for /f delims^=^ eol^= %%A in (merged.tmp2) do (
set "newLn=%%A"
setlocal enableDelayedExpansion
if /i "!newLn!" neq "!ln!" (
endlocal
set "ln=%%A"
echo %%A
) else endlocal
)
)
del merged.tmp merged.tmp2
答案 3 :(得分:0)
将其添加到您的cmd文件中:
set cpy=
set filter=*.txt
set target=new_file.txt
del newfile.tmp
rem buildup concat
for %%a in (%filter%) do call :concat "%%a"
ren newfile.tmp %target%
rem REMOVE FILES! (carefull please!)
for %%a in (%filter%) do del /Q "%%a"
goto :done
:concat
if EXIST newfile.tmp ( copy newfile.tmp+%1 newfile.tmp ) else ( copy %1 newfile.tmp)
goto :EOF
:done
echo ready