Unix 将大文件一分为二,同时保留头文件
我有一个非常大的文本文件(约1.8TB),需要在某个条目上拆分。我知道这个条目在哪一行,但我也可以通过grep命令识别它。我只关心从此条目开始的文件部分 我看到像csplit这样的某些Unix命令可以做到这一点。但是,文件也有一个重要的头(30行长),新创建的文件也必须包含这个头。由于没有办法预先准备文件,我有点困惑如何做这件事。Csplit和split似乎没有将其输出附加到现有文件的选项,我认为该文件太大,无法使用文本编辑器进行编辑Unix 将大文件一分为二,同时保留头文件,unix,split,grep,csplit,Unix,Split,Grep,Csplit,我有一个非常大的文本文件(约1.8TB),需要在某个条目上拆分。我知道这个条目在哪一行,但我也可以通过grep命令识别它。我只关心从此条目开始的文件部分 我看到像csplit这样的某些Unix命令可以做到这一点。但是,文件也有一个重要的头(30行长),新创建的文件也必须包含这个头。由于没有办法预先准备文件,我有点困惑如何做这件事。Csplit和split似乎没有将其输出附加到现有文件的选项,我认为该文件太大,无法使用文本编辑器进行编辑 如果有任何建议,我将不胜感激 我在一个1000万行的文件上测
如果有任何建议,我将不胜感激 我在一个1000万行的文件上测试了这些命令,希望您会发现它们很有用 将标题(文件的前30行)提取到单独的文件中,
header.txt
:
perl -ne 'print; exit if $. == 30' 1.8TB.txt > header.txt
perl -ne 'print' header.txt 0.9TB.txt > header_and_0.9TB.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; exit if $. == 30' 1.8TB.txt > header.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
创建的文件)