unix 如何在删除原始文件的同时分割带有头的大量文本文件?

monwx1rj  于 2023-06-05  发布在  Unix
关注(0)|答案(1)|浏览(237)

我有一个巨大的、管道分隔的.txt文件(300GB),我试图将它拆分成1GB的文件,以便在Python中进行进一步分析。不过,我的电脑没有足够的空间容纳另外300 GB,所以我想在分割原始文件时删除块。该文件也有一个头,我想保留在所有分割文件。
我试过在Bash中分割它,但无法找出一种方法,同时删除原始文件.文件太大,无法完整加载到Python中。
编辑:我想做这样的事情,但有一个标题:
https://unix.stackexchange.com/questions/628747/split-large-file-into-chunks-and-delete-original

goucqfw6

goucqfw61#

假设:

  • 数据字段不包括嵌入式换行符,否则head和/或tail命令可能(错误地)分割数据行

this answer上扩展到OP提供的unix.stackexchange.com链接:

numfiles=100                                       # OP determines beforehand how many files to create
numlines=100000                                    # OP determines beforehand how many lines to move to each new file

head -1 bigfile > header                           # make a copy of the header line

for ((i=numfiles; i>1; i--))
do
    newf=newfile.$i
    cp header "${newf}"
    tail -${numlines} bigfile >> "${newf}"
    truncate -s -$(wc -c < "${newf}") bigfile
done

mv bigfile newfile.1                               # rename what's left of the original file

**注意:**需要truncate(GNU核心实用程序的一部分,例如sudo apt-get install coreutils

性能:

  • bigfile:1000万行,810 MB
  • 10秒:cygwin在Win10虚拟机(Ubuntu主机、NVME Gen 4 PCIe驱动器)中运行
  • 2秒:直接在同一台Ubuntu主机上运行

相关问题