Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 将大文件一分为二,同时保留头文件_Unix_Split_Grep_Csplit - Fatal编程技术网

Unix 将大文件一分为二,同时保留头文件

Unix 将大文件一分为二,同时保留头文件,unix,split,grep,csplit,Unix,Split,Grep,Csplit,我有一个非常大的文本文件(约1.8TB),需要在某个条目上拆分。我知道这个条目在哪一行,但我也可以通过grep命令识别它。我只关心从此条目开始的文件部分 我看到像csplit这样的某些Unix命令可以做到这一点。但是,文件也有一个重要的头(30行长),新创建的文件也必须包含这个头。由于没有办法预先准备文件,我有点困惑如何做这件事。Csplit和split似乎没有将其输出附加到现有文件的选项,我认为该文件太大,无法使用文本编辑器进行编辑 如果有任何建议,我将不胜感激 我在一个1000万行的文件上测

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

我看到像csplit这样的某些Unix命令可以做到这一点。但是,文件也有一个重要的头(30行长),新创建的文件也必须包含这个头。由于没有办法预先准备文件,我有点困惑如何做这件事。Csplit和split似乎没有将其输出附加到现有文件的选项,我认为该文件太大,无法使用文本编辑器进行编辑


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

我在一个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
创建的文件)