Bash 逐行写入gzip文件

Bash 逐行写入gzip文件,bash,file,concatenation,gzip,Bash,File,Concatenation,Gzip,我正在处理数百万行的大数据 我有一个生成这些行的COTS脚本,我需要根据内容将这些行注释到不同的文件中。由于文件的大小是纯文本的,所以如果数据可以直接以gzip格式写入,这将是非常理想的 即 同样,由于极端的文件大小和行数,在转储到GZIP文件之前,我不确定是否可以先在内存中构建文件 您正在为每一行分别分叉一个副本gzip。这不是一个很好的主意,因为它很慢,而且压缩也会受到影响,因为所有的行都被压缩为独立的块。对于短线,结果可能比未压缩版本长 但是,您可以使用exec和打开管道一次,然后在循环期

我正在处理数百万行的大数据

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

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

您正在为每一行分别分叉一个副本gzip。这不是一个很好的主意,因为它很慢,而且压缩也会受到影响,因为所有的行都被压缩为独立的块。对于短线,结果可能比未压缩版本长

但是,您可以使用exec和打开管道一次,然后在循环期间继续写入管道exec使用命令替换shell,但没有命令,任何操作都会在shell进程中进行。例如:

#!/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>&-

使用动态压缩文件系统,例如btrfs和gzip压缩。太棒了!谢谢!
#!/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>&-