逐行写入gzip文件

时间:2017-12-01 14:19:42

标签: bash file concatenation gzip

我正在使用大数据(数百万行)。

我有一个生成这些行的COTS脚本,我需要按内容将行注释到不同的文件中。由于文件的大小是纯文本,如果数据可以直接用gzip格式编写,那将是理想的。

line_generator | while read line; do
  [[ $line =~ .*0/0.* ]] && { echo "${#line}," | gzip -9 >> REF.out.gz ; }
  [[ $line =~ .*0/1.* ]] && { echo "${line}" | gzip -9 >> MAT.out.gz ; }
  [[ $line =~ .*1/0.* ]] && { echo "${line} | sed 's/X/y/g'" | gzip -9 >> MAT.out.gz ; }
done

同样,由于极端文件大小和行数,我不确定在转储到GZIP&#ped;文件之前,我可以先在内存中构建文件。

1 个答案:

答案 0 :(得分:1)

您需要为每一行分别复制exec副本。这不是一个好主意,因为它很慢并且压缩受此影响,因为所有行都被压缩为独立块。使用短行,结果可能比未压缩版本更长......

但是,您可以使用#!/bin/bash exec 3> >(gzip -9 >> odd.out.gz) exec 4> >(gzip -9 >> even.out.gz) seq 1 1000 | while read x ; do [[ $x =~ [13579]$ ]] && echo "$x" >&3 [[ $x =~ [02468]$ ]] && echo "$x" >&4 done # close the pipes when you're done exec 3>&- exec 4>&- process substitution打开管道,然后在循环期间继续写入它们(带有命令的exec替换shell,但没有命令,任何{{ 3}}发生在shell进程中)。例如:

class