合并排序gzip压缩文件

mos*_*aab 9 unix linux bash

我有40个文件,每个2GB,存储在NFS架构上.每个文件包含两列:数字ID和文本字段.每个文件都已经过排序和gzip压缩.

如何合并所有这些文件,以便生成的输出也被排序?

我知道sort -m -k 1应该为未压缩文件做诀窍,但我不知道如何直接使用压缩文件.

PS:我不想要将文件解压缩到磁盘,合并它们以及再次压缩的简单解决方案,因为我没有足够的磁盘空间.

use*_*342 16

这是进程替换的用例.假设您有两个要排序的文件,sorta.gz并且sortb.gz.您可以gunzip -c FILE.gz使用<(...)shell运算符给出输出以对这两个文件进行排序:

sort -m -k1 <(gunzip -c sorta.gz) <(gunzip -c sortb.gz) >sorted
Run Code Online (Sandbox Code Playgroud)

进程替换使用表示该命令输出的文件名替换命令,并且通常使用命名管道或/dev/fd/...特殊文件实现.

对于40个文件,您将需要动态创建具有许多进程替换的命令,并用于eval执行它:

cmd="sort -m -k1 "
for input in file1.gz file2.gz file3.gz ...; do
    cmd="$cmd <(gunzip -c '$input')"
done
eval "$cmd" >sorted       # or eval "$cmd" | gzip -c > sorted.gz
Run Code Online (Sandbox Code Playgroud)