【问题标题】:Concatenate text files with Windows command line, dropping leading lines使用 Windows 命令行连接文本文件,删除前导行
【发布时间】:2011-01-29 10:54:50
【问题描述】:

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

type file1.txt file2.txt > out.txt

让我几乎可以得到我想要的,但我不希望 file2.txt 的第一行包含在 out.txt 中。

我注意到more 有+n 选项来指定起始线,但我还没有设法将它们组合起来以获得我想要的结果。我知道这在 Windows 中可能是不可能的,我总是可以手动编辑 out.txt 以摆脱该行,但有没有一种简单的方法可以从命令行执行它?

【问题讨论】:

    标签: windows command-line concatenation


    【解决方案1】:

    copy 的帮助说明通配符可用于将多个文件连接为一个。

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

    copy abc*.txt xyz.txt
    

    【讨论】:

      【解决方案2】:

      你也可以试试这个

      type file2.txt >> file1.txt
      

      它将file2.txt的内容附加到file1.txt的末尾

      如果您需要原始file1.txt,请事先进行备份。或者你可以这样做

      type file1.txt > out.txt
      type file2.txt >> out.txt
      

      如果你想在第一个文件的末尾有一个换行符,你可以在追加之前尝试以下命令。

      type file1.txt > out.txt
      printf "\n" >> out.txt
      type file2.txt >> out.txt
      

      【讨论】:

        【解决方案3】:

        这需要带有标题的Test.txt 并附加Test1.txt 和Test2.txt,并在分别从第二个和第三个文件中剥离标题后将结果写入Testresult.txt 文件:

        type C:\Test.txt > C:\Testresult.txt && more +1 C:\Test1.txt >> C:\Testresult.txt && more +1 C:\Test2.txt >> C:\Testresult.txt
        

        【讨论】:

          【解决方案4】:

          在PowerShell中:

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

          【讨论】:

            【解决方案5】:

            这是如何做到这一点的:

            (type file1.txt && more +1 file2.txt) > out.txt
            

            【讨论】:

              【解决方案6】:

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

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

              【讨论】:

              • 如何跳过 OP 询问的 file2 中的第一行?
              【解决方案7】:
              more +2 file1.txt > type > out.txt && type file2.txt > out.txt
              

              【讨论】:

                【解决方案8】:

                我会把这个放在对 ghostdog74 的评论中,除了我的代表太低,所以就这样吧。

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

                type temp file1.txt > out.txt

                目前尚不清楚此代码产生的顺序。是将temp 附加到file1.txt(根据需要),还是将file1.txt 附加到temp(不理想,因为标题行将隐藏在结果文件的中间)。

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

                【讨论】:

                  【解决方案9】:

                  我用这个,它很适合我:

                  TYPE \\Server\Share\Folder\*.csv >> C:\Folder\ConcatenatedFile.csv

                  当然,每次跑步前,你都要DELETE C:\Folder\ConcatenatedFile.csv

                  唯一的问题是,如果所有文件都有标题,那么它将在所有文件中重复。

                  【讨论】:

                  • 当我输入连接文件的文件名时,这意味着它在文件的末尾列出(按字母顺序),然​​后 windows 似乎连接了两次!我最终使用 1filename.csv 的文件名没有问题。我想连接到不同的文件夹也应该工作......
                  • 如果使用 > 而不是 >>,则不必事先删除文件。 > 每次重定向输出并创建新文件。 >> 重定向输出并追加。
                  • 如何跳过 OP 询问的 file2 中的第一行?
                  • 它不会跳过 file2 中的第一行。我错过了问题的那一部分。
                  • 有什么命令可以从合并文件中检索原始文件吗?
                  【解决方案10】:

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

                  在 Windows 中尝试了一大堆命令并感到非常沮丧之后,还尝试了各种承诺能够打开大文件但又无法打开的图形编辑器,我终于回到了我的 Linux 根源并打开我的 Cygwin 提示符。两条命令:

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

                  对于file1.csv 800MB 和file2.csv 400MB,这两个命令在我的机器上耗时不到 5 秒。在 Cygwin 提示符下,同样如此。我认为 Linux 命令在 Cygwin 中应该很慢,但这种方法比我能找到的任何 Windows 方法都省力得多。

                  【讨论】:

                    【解决方案11】:
                    more +2 file2.txt > temp
                    type temp file1.txt > out.txt
                    

                    或者您可以使用copy。请参阅copy /? 了解更多信息。

                    copy /b temp+file1.txt  out.txt
                    

                    【讨论】:

                    • 当然!不过,我宁愿避免使用临时文件。我尝试使用括号、管道和 copy 命令要快得多,但它会在末尾添加一个 SUB 字符。有没有办法避免这种情况?
                    • 我要补充一点,如果您想连接所有文件,您可以使用copy /b *.txt combined.txt,而无需单独列出文件。
                    • 更多貌似把tab转成空格,可惜!
                    • 有什么命令可以从合并文件中检索原始文件吗?
                    • @ghostdog74:我认为它必须是 type file1.txt temp > out.txt 才能实际附加第二个文件,而不是第一个文件的标题
                    【解决方案12】:

                    使用 FOR 命令逐行回显文件,并使用“跳过”选项错过许多起始行...

                    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 变量时,请注意双 %。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2013-10-14
                      • 1970-01-01
                      • 2020-10-20
                      • 2014-01-13
                      • 2022-10-23
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多