【问题标题】:How to extract a portion (not beginning) of .gz file?如何提取 .gz 文件的一部分(不是开头)?
【发布时间】:2017-05-10 12:06:16
【问题描述】:

我有一个大的 gz 文件 (11 GB),我无法将其解压缩到我的计算机上,即使有 100 GB 可用空间。我使用以下命令提取了前 50 GB:

gzip -cd file.gz | dd ibs=1024 count=50000000 > first_50_GB_file.txt

我能够从文件的这一部分成功解析我的数据。现在我想提取文件的另一部分进行解析。我试图从文件中提取最后 n 行,然后按如下方式解压缩:

tail -50 file.gz > last_part_of_file.gz

我希望之后,我可以使用:

gzip -cd last_part_of_file.gz | dd ibs=1024 count=50000000 > last_50_GB_file.txt

但 tail 命令仅测试 50 行需要 >10 分钟。

如果有人对如何提取 .gz 文件中不包括开头的部分(可能是任意的)有任何解决方案,我将不胜感激。

【问题讨论】:

    标签: bash compression gzip gunzip


    【解决方案1】:

    tail 不能处理二进制文件; tail -50 返回寻找 '\n' (char 10) 分隔符的最后 50 行。

    gzip -cd file.gz | dd ibs=1024 count=50000000 > first_50_GB_file.txt
    
    gzip -cd file.gz | dd ibs=1024 skip=50000000 > after_50_GB_file.txt
    

    虽然我首先提取的文件大小是 100GB。 将空间限制为 50GB

    gzip -cd file.gz | dd ibs=1024 skip=50000000 count=50000000 > next_50-100_GB_file.txt
    

    接下来的 50GB

    gzip -cd file.gz | dd ibs=1024 skip=100000000 count=50000000 > next_100-150_GB_file.txt
    

    但每次 gzip 进程必须从归档文件的开头膨胀 由于压缩算法。

    【讨论】:

    • 谢谢,现在我明白为什么 tail 不起作用了。我试过这个并没有太大的成功。使用'gzip -cd file.gz | dd ibs=1024 skip=50000000 > after_50_GB_file.txt' 占用了我磁盘上的所有空间。所以我假设我必须告诉命令在一定数量的块后停止。然后我尝试了:'gzip -cd file.gz | dd ibs=1024 skip=49000000 count=50000000 > after_49_GB_next_50GB.txt' 这产生了一个 90 GB 的文件。你知道会发生什么吗?
    • 你得到了什么?
    • 我能够使用它:gzip -cd file.gz | dd ibs=1024 skip=49000000 count=50000000 of=after_49GB_next_50_GB_file.txt 谢谢你的帮助!
    • 事实上,前 50GB 已经被提取,确切的 dd 参数是 skip=50000000 count=50000000
    猜你喜欢
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    相关资源
    最近更新 更多