在为每个拆分添加标题行时拆分大型gzip文件

时间:2017-02-22 22:59:37

标签: shell unix awk sed

我想自动执行将大型gzip文件拆分为较小gzip文件的过程,每个文件包含10000000行(最后一次拆分将留下并且将小于10000000)。< / p>

这就是我现在正在做的事情,我实际上是通过计算剩余行数来重复的。

gunzip -c large_gzip_file.txt.gz | tail -n +10000001 | head -n 10000000 > split1_.txt 
gzip split1_.txt

gunzip -c large_gzip_file.txt.gz | tail -n +20000001 | head -n 10000000 > split2_.txt 
gzip split2_.txt

我继续这样做,重复如图所示直到结束。然后我打开这些并手动添加标题行。如何实现这一目标。

我在线搜索awk和其他解决方案,但没有看到gzip或类似的情况。

2 个答案:

答案 0 :(得分:1)

我认为awk不是将gzip文件拆分成较小的文件,而是用于文本处理。以下是我解决问题的方法,希望有所帮助:

<强>步骤1:

gunzip -c large_gzip_file.txt.gz | split -l 10000000 - split_file_

split命令可以将文件拆分成碎片,您可以指定每个碎片的大小,并为所有碎片提供前缀。

大型gzip文件将被拆分为多个名称前缀为split_file_

的文件

<强>步骤2

将标题内容保存到文件header_file.csv

<强>步骤3:

for f in split_file*; do
  cat header_file.csv $f > $f.new
  mv $f.new $f
done

这里我假设您在拆分文件目录中工作,如果没有,请用绝对路径替换split_file*,例如/path/to/split_file*。迭代名称模式为split_file*的所有文件,将标题内容添加到每个匹配文件的开头

答案 1 :(得分:1)

我会这样做:

  1. gunzip文件
  2. 使用head获取第一行并将其保存到另一个文件
  3. 使用tail获取文件的其余部分并将其传输到split以生成每个10,000,000行的文件
  4. 使用sed将标题插入每个文件,或者只是将标题与每个文件相关联
  5. gzip每个文件
  6. 您需要将其包装在脚本或函数中,以便以后重新运行。这是一个尝试解决方案,经过轻微测试:

    #!/bin/bash
    
    set -euo pipefail
    
    LINES=10000000
    
    file=$(basename $1 .gz)
    
    gunzip -k ${file}.gz
    head -n 1 $file >header.txt
    tail -n +2 $file | split -l $LINES - ${file}.part.
    rm -f $file
    
    for part in ${file}.part.* ; do
      [[ $part == *.gz ]] && continue # ignore partial results of previous runs
    
      gzip -c header.txt $part >${part}.gz
    
      rm -f $part
    done
    
    rm -f header.txt
    

    使用:

    $ ./splitter.sh large_gzip_file.txt.gz
    

    我会通过对中间文件使用临时目录(mktemp -d)来进一步改进这一点,并确保脚本在退出后自行清理(使用trap)。理想情况下,它还可以检查参数,可能接受指示每个部分的行数的第二个参数,并检查当前目录的内容以确保它不会破坏任何预先存在的文件。