使用Windows命令行连接文本文件,删除前导行

132

我需要将一些相对较大的文本文件连接起来,希望能通过命令行完成。不幸的是,我只有Windows系统,并且无法安装新软件。

type file1.txt file2.txt > out.txt

我可以使用某个命令将文件内容输出到另一个文件,但是我不想在输出的文件中包含file2.txt的第一行。

我注意到more 命令有一个 +n 选项,可以指定起始行,但我没能成功地将它与其他命令结合使用以达到想要的结果。我知道在Windows环境下这可能不可行,我也可以手动编辑out.txt来删除该行,但是否存在一种简单的方式可以通过命令行实现?

13个回答

140
more +2 file2.txt > temp
type temp file1.txt > out.txt

或者您可以使用copy命令。有关更多信息,请参见copy /?

copy /b temp+file1.txt  out.txt

4
当然可以!不过我本来更希望避免使用临时文件。我尝试使用括号、管道符和小于号将其放入一个命令中,但一无所获。copy 命令速度更快,但会在末尾添加 SUB 字符,有没有办法避免这种情况呢? - James
20
我想补充一点,如果你想要合并所有文件,可以使用 copy /b *.txt combined.txt 而不需要逐个列出每个文件。请注意,这种方法只适用于文本文件。 - Phlucious
1
看起来更多的是将制表符转换为空格,可惜啊! - Antonio
有没有命令可以从合并的文件中检索原始文件? - swapnil gandhi
3
我认为正确的命令应该是 type file1.txt temp > out.txt,这样才能将第二个文件附加到第一个文件末尾,而且没有头部信息。 - Marius

62
我使用这个命令,它对我很有效: TYPE \\Server\Share\Folder\*.csv >> C:\Folder\ConcatenatedFile.csv 当然,在每次运行之前,您必须DELETE C:\Folder\ConcatenatedFile.csv 唯一的问题是,如果所有文件都有标题,则标题将在所有文件中重复。

2
当我输入一个文件名作为连接文件的名称时,它会被列在该位置的文件末尾(按字母顺序),然后Windows似乎会进行两次连接!最终我使用了1filename.csv的文件名来避免这个问题。我猜想将其连接到另一个文件夹中也应该可以解决这个问题... - SebK
1
如果你使用 > 而不是 >>,你就不需要事先删除文件。> 重定向输出并每次都创建新文件。 >> 重定向输出并追加到文件末尾。 - Eddie Deyo
1
这个代码如何跳过文件2中的第一行,这正是OP所询问的? - Dan Dascalescu
1
它没有跳过file2中的第一行。我错过了问题的那部分。 - Raj More
1
有没有命令可以从合并的文件中检索原始文件? - swapnil gandhi

23

我没有足够的声望来评论使用*.csv >> ConcatenatedFile.csv的建议,但我可以添加一个警告:

如果您在用于连接的同一目录中创建ConcatenatedFile.csv文件,则它将被添加到自身。


2
这个代码如何跳过文件2中的第一行,这正是OP所询问的? - Dan Dascalescu

6
使用FOR命令逐行输出文件,并使用“skip”选项跳过若干起始行...
FOR /F "skip=1" %i in (file2.txt) do @echo %i

您可以重定向批处理文件的输出,其内容类似于...
FOR /F %%i in (file1.txt) do @echo %%i
FOR /F "skip=1" %%i in (file2.txt) do @echo %%i

请注意,在批处理文件中使用FOR变量时需要双%%。

5
以下是如何完成此操作的步骤:
(type file1.txt && more +1 file2.txt) > out.txt

4
我会把这个留言发给ghostdog74,不过我的声望太低了,所以我在这里写。

more +2 file2.txt > temp
这段代码实际上会忽略文件的第一行和第二行。OP想保留第一个文件的所有行(以保留标题行),然后在第二个文件中排除第一行(假定是相同的标题行),因此要仅排除标题行,OP应该使用more +1

type temp file1.txt > out.txt

不清楚这段代码的结果顺序是什么。是将temp附加到file1.txt(如所需),还是将file1.txt附加到temp(不希望标题行被埋在生成的文件中间)。

此外,对于大文件(例如300MB),这些操作需要很长时间。


3

在PowerShell中:

Get-Content file1.txt | Out-File out.txt
Get-Content file2.txt | Select-Object -Skip 1 | Out-File -Append out.txt

2

我知道你说你不能安装任何软件,但我不确定限制有多严格。无论如何,我遇到了同样的问题(试图连接两个文件,这两个文件可能具有相同的标头),所以我想为那些来到这个页面的人提供一个替代答案,因为对我来说它非常有效。

在尝试了许多Windows命令并感到非常沮丧之后,我尝试了各种图形编辑器,它们承诺能够打开大文件,但实际上不能。最终我回到了我的Linux根源,并打开了我的Cygwin提示符。只需两个命令:

cp file1.csv out.csv
tail -n+2 file2.csv >> out.csv

对于大小分别为800MB的file1.csv和400MB的file2.csv文件,在我的计算机上使用这两个命令不到5秒钟就完成了。而且是在Cygwin提示符下执行的。我原本以为在Cygwin中运行Linux命令会很慢,但这种方法比我找到的任何Windows方法都要简单得多,也更容易。


0

copy 的帮助文档解释了通配符可以用来将多个文件连接成一个。

例如,将当前文件夹中以 "abc" 开头的所有 .txt 文件复制到一个名为 xyz.txt 的单个文件中:

copy abc*.txt xyz.txt

0
在Windows 10中,查看FORFILES命令。你需要修改我下面的示例,将原始文件附加到掩码之外,否则你将丢失列标题。如果你能安排好第一个从“*.csv”返回的文件的第二行是列标题,那么无论如何都没问题。比如,将它放在根目录下,覆盖真正的.csv文件所在的子目录。
要小心输出路径,因为这个命令似乎喜欢在运行'cmd'之前对文件路径的父目录进行'cd'操作。所以像.\All.NotCSV这样的路径会在包含.csv文件的每个文件夹中放置一个文件,并且你会回到起点。最好是硬编码输出文件路径。
forfiles /S /M *.csv /C "cmd /C more +1 @path >> ..\All.NotCSV"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接