循环文件夹和合并文件?

时间:2012-10-28 18:35:52

标签: batch-file

我想循环浏览一个包含文本文件的文件夹并将它们放在一起。

当它们合并时,我想删除重复项并对它们进行排序。

如何使用批处理脚本完成此操作?

4 个答案:

答案 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