我正在尝试使用以下命令将多个文件合并在一起:
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