批处理 - 如何在没有标题记录的情况下将多个文件合并在一起

批处理 - 如何在没有标题记录的情况下将多个文件合并在一起

我正在尝试使用以下命令将多个文件合并在一起:

copy test1.txt+test2.txt test3.txt

这工作得很好,但是,我尝试合并的文件在每个文件的开头都包含标题记录。是否有命令可以用来排除 txt 文件的第一行,而只连接其余部分?

编辑:最终目标是将包含数十万条记录的六个 .txt 文件合并为一个文件。

答案1

在大多数情况下,以下命令行都可以很好地工作

(for %F in (test1.txt test2.txt) do @more +1 "%%F") >test3.txt

如果在批处理脚本中使用该命令,则将百分比加倍。

上述内容有以下限制

  • 每个源文件必须少于 64k 行,否则它将会挂起。
  • 任何制表符都将转换为空格字符串
  • 我认为至少还有一个其他限制,但我的记忆失败了(也许空字节转换为换行符??)



以下批处理脚本没有限制,除了每行的长​​度必须小于 8k。但对于大文件来说,它可能太慢了(批处理对于文本处理来说是一个糟糕的工具):

@echo off
setlocal disableDelayedExpansion
>test3.txt (
  for %%F in (test1.txt test2.txt) do for /f "skip=1 delims=" %%A in (
    'findstr /n "^" "%%F"'
  ) do (
    set "ln=%%A"
    setlocal enableDelayedExpansion
    echo(!ln:*:=!
    endlocal
  )
)



您可以编写一个自定义的 JScript 或 VB 脚本来有效地完成此操作。

我的JREPL.BAT 混合 JScript/批处理实用程序可以很好地处理这个问题。虽然有点过头了,但它可以高效地完成工作,即使文件非常大。

JREPL.BAT 是一个通用的正则表达式文本处理器,具有许多选项。它是纯脚本,可​​以在 XP 及以上版本的任何 Windows 机器上本地运行。

以下内容将在命令行上运行。

>test3.txt (for %F in (test1.txt test2.txt) do @JREPL "^.*" "ln>1?$0:false" /jmatch /f "%F")

如果在批处理脚本中使用,则必须使用 CALL JREPL,并将百分比加倍:

@echo  off
>test3.txt (for %%F in (test1.txt test2.txt) do call JREPL "^.*" "ln>1?$0:false" /jmatch /f "%%F")

答案2

如果所有标题都是一行,那么您可以使用for file in test*.txt ; do cat $file | sed '1d;$d' ; done > output.file

解释:

for variable in pattern在 for 循环中使用 bash。
最简单的演示方法是for a in * ; do echo $a; done列出当前目录中的所有文件(可能还有文件夹)。

输出通过 sed(流编辑器)传输,命令是删除第一行(假设:您的标题只有一行长)。

> output_file应该是显而易见的。

我确信还有更高级的方法。例如,使用 find 和 -type f 仅获取文件。但在紧急情况下,这是一个非常简单的解决方案,仅使用 bash 和 sed 和 cat(并且您明确将其标记为 bash 并要求将内容合并)。


编辑:正如指出的那样,此语法类似于 Windows。因此平台可能是 Windows。

在这种情况下看看Stack Overflow 上的这篇文章答案包含FOR /F "tokens=* skip=1" %A IN ('type "input_file.ext"') DO @echo %A>>"output_file.ext"

关键是更多+1

相关内容