【问题标题】:Splitting large file in two while keeping header将大文件一分为二,同时保留标题
【发布时间】:2021-05-24 10:52:28
【问题描述】:

我有一个非常大的文本文件(大约 1.8TB),我需要在某个条目处拆分它。我知道这个条目在哪一行,但我也可以通过 grep 命令识别它。我只关心从这个条目开始的文件部分。

我看到像 csplit 这样的某些 Unix 命令可以做到这一点。但是,该文件也有一个重要的标题(30 行长),重要的是新创建的文件也包含此标题。由于没有办法在文件前面加上,我有点难过如何做到这一点。 Csplit 和 split 似乎没有将其输出附加到现有文件的选项,而且我认为该文件太大,我无法使用文本编辑器对其进行编辑。

如果有任何建议,我将不胜感激!

【问题讨论】:

    标签: unix split grep csplit


    【解决方案1】:

    我在一个有 1000 万行的文件上测试了这些命令,希望对您有用。

    将标题(文件的前 30 行)提取到一个单独的文件中,header.txt:

    perl -ne 'print; exit if $. == 30' 1.8TB.txt > header.txt
    

    现在您可以编辑文件header.txt,以便在其末尾添加一两行空行,作为它与文件其余部分之间的视觉分隔符。

    现在将您的大文件从第 5 百万行复制到文件末尾 - 到新文件 0.9TB.txt. 中,而不是数字 5000000,在此处输入您要开始复制文件的行号,正如你所说,你知道:

    perl -ne 'print if $. >= 5000000' 1.8TB.txt > 0.9TB.txt
    

    请耐心等待,这可能需要一段时间。您可以启动“top”命令来查看发生了什么。您还可以使用tail -f 0.9TB.txt 跟踪不断增长的文件

    现在合并header.txt0.9TB.txt

    perl -ne 'print' header.txt 0.9TB.txt > header_and_0.9TB.txt
    

    让我知道此解决方案是否适合您。

    编辑:步骤 2 和 3 可以合并为一个:

    perl -ne 'print if $. >= 5000000' 1.8TB.txt >> header.txt
    mv header.txt 0.9TB.txt
    

    编辑 26.05.21: 我用split 测试了这个解决方案,它的速度要快很多:

    如果您没有perl,请使用head 提取标题:

    head -n30 1.8TB.txt > header.txt
    
    split -l 5000030 1.8TB.txt 0.9TB.txt
    

    (注意扩展名为*.txtab的文件,由split创建)

    cat 0.9TB.txtab >> header.txt
    
    mv header.txt header_and_0.9TB.txt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-09
      • 2018-12-27
      • 2020-06-22
      • 1970-01-01
      • 1970-01-01
      • 2016-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多