unix - 将大文件一分为二,同时保留标题
问题描述
我有一个非常大的文本文件(约 1.8TB),需要在某个条目处拆分。我知道这个条目在哪一行,但我也可以通过 grep 命令识别它。从这个条目开始,我只关心文件的一部分。
我看到像 csplit 这样的某些 Unix 命令可以做到这一点。但是,该文件也有一个重要的标题(30 行长),重要的是新创建的文件也包含此标题。由于无法预先添加到文件中,我有点难过如何做到这一点。Csplit 和 split 似乎没有将其输出附加到现有文件的选项,而且我认为该文件太大,我无法使用文本编辑器对其进行编辑。
我将不胜感激任何建议!
解决方案
我在一个有 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.txt
and 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
提取标题:
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
推荐阅读
- javascript - 位置 0 处的 JSON 中的意外令牌 Api Rest 文件上传
- sql - 尝试选择数据,然后对 mariadb 中的所选数据进行平均
- macos - Flutter App 未安装在 Android Real 设备上
- collections - 在 JDK 11 ConcurrentHashMap putVal() 方法中,仅 3 个键值对 put 操作的命中计数显示为 131 谁能解释内部发生了什么?
- python - 如何覆盖 Python 中默认的 pickle 和 torch 文件读取行为,以便事先执行文件解密?
- spring - Spring (Kotlin) 应用程序运行时的内存消耗行为
- microsoft-teams - 如何将自适应卡片打开 URL 操作中的 URL 加载到团队频道网站选项卡中
- sql - 按一列分组,但选择多个
- powershell - 如何使用 Powershell 在 Dropbox 中递归地忽略文件
- python - 如何请求从 ipcam 获取图片?