将大文件一分为二,同时保持 header
Splitting large file in two while keeping header
我有一个非常大的文本文件(大约 1.8TB),我需要在某个条目处拆分。我知道这个条目在哪一行,但我也可以通过 grep 命令识别它。我只关心从这个条目开始的文件部分。
我看到像 csplit 这样的某些 Unix 命令可以做到这一点。但是,该文件还有一个重要的 header(30 行长),重要的是新创建的文件也将包含此 header。由于没有办法添加到文件中,我对如何执行此操作感到困惑。 Csplit 和 split 似乎没有将它们的输出附加到现有文件的选项,而且我认为该文件太大,我无法使用文本编辑器对其进行编辑。
如有任何建议,我将不胜感激!
我在一个 1000 万行的文件上测试了这些命令,希望您会发现它们有用。
将 header(文件的前 30 行)提取到一个单独的文件中,header.txt
:
perl -ne 'print; exit if $. == 30' 1.8TB.txt > header.txt
现在您可以编辑文件 header.txt
以在其末尾添加一两行空行,作为它与文件其余部分之间的视觉分隔符。
现在将你的大文件从第 500 万行复制到文件末尾 - 到新文件中 0.9TB.txt.
在这里输入你想要开始的行号而不是数字 5000000从您所说的复制文件:
perl -ne 'print if $. >= 5000000' 1.8TB.txt > 0.9TB.txt
请耐心等待,这可能需要一段时间。您可以启动“top
”命令来查看发生了什么。您还可以使用 tail -f 0.9TB.txt
跟踪不断增长的文件
现在合并 header.txt
和 0.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
提取header:
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
我有一个非常大的文本文件(大约 1.8TB),我需要在某个条目处拆分。我知道这个条目在哪一行,但我也可以通过 grep 命令识别它。我只关心从这个条目开始的文件部分。
我看到像 csplit 这样的某些 Unix 命令可以做到这一点。但是,该文件还有一个重要的 header(30 行长),重要的是新创建的文件也将包含此 header。由于没有办法添加到文件中,我对如何执行此操作感到困惑。 Csplit 和 split 似乎没有将它们的输出附加到现有文件的选项,而且我认为该文件太大,我无法使用文本编辑器对其进行编辑。
如有任何建议,我将不胜感激!
我在一个 1000 万行的文件上测试了这些命令,希望您会发现它们有用。
将 header(文件的前 30 行)提取到一个单独的文件中,header.txt
:
perl -ne 'print; exit if $. == 30' 1.8TB.txt > header.txt
现在您可以编辑文件 header.txt
以在其末尾添加一两行空行,作为它与文件其余部分之间的视觉分隔符。
现在将你的大文件从第 500 万行复制到文件末尾 - 到新文件中 0.9TB.txt.
在这里输入你想要开始的行号而不是数字 5000000从您所说的复制文件:
perl -ne 'print if $. >= 5000000' 1.8TB.txt > 0.9TB.txt
请耐心等待,这可能需要一段时间。您可以启动“top
”命令来查看发生了什么。您还可以使用 tail -f 0.9TB.txt
现在合并 header.txt
和 0.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
提取header:
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