0

我有很多名为 xaa.gz、xab.gz、xac.gz 等的大型压缩文件。不幸的是,它们没有排序。我想做相当于以下的事情。

zcat x*|sort > largefile

split -l 1000000 largefile

然后 gzip 拆分的文件并丢弃之前制作的所有其他文件。

问题是这会产生一个巨大的未压缩文件,然后是许多较小的未压缩拆分文件,然后再压缩它们。是否可以在不制作大文件的情况下完成整个操作,并且最好在压缩之前不保存拆分文件?

我有 8 个核心,所以我也想利用它们(我没有 coreutils 8.20,所以不能利用 sort --parallel)。

4

1 回答 1

3

不是完整的代码,而是关于你可以在这里做什么的一些想法。

1)分区输入文件以并行处理它们:

num_cores=8
i=0
while read f; do
  part_name=part$i
  set $part_name="${!part_name} $f"
  (( i=(i+1)%num_cores ))
done < <(ls x*.gz)

2)在不同进程中对部分文件进行解压和排序:

sort -m <(zcat $part0 | sort) <(zcat $part1 | sort) ...

3) 告诉 split 立即压缩文件:

... | split -l 1000000 --filter='gzip > $FILE.gz'
于 2013-08-08T13:29:43.180 回答