0

我想遍历一个包含文本文件的文件夹并将它们合并在一起。

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

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

4

4 回答 4

2

只要目标文件名不匹配通配符规范,最简单的方法是这样的:

copy /b file?.txt new_file.txt

/b意味着以“二进制”模式复制。否则,默认设置/a将停止在 a 处复制任何源文件Ctrl+Z,并在文件末尾附加 a 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 排序是一个非常有用的实用程序。

于 2012-10-28T19:21:27.273 回答
1

补充 lavinio 答案,以遵守 OP 要求“删除重复项并对它们进行排序”,在连接文件后,使用 powershell 排序和获取唯一命令

gc allfiles.txt | sort | get-unique > allfiles.txt 
于 2012-10-28T20:16:05.443 回答
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
于 2012-10-28T21:46:53.937 回答
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
于 2012-10-28T19:14:49.270 回答