如何在不使用临时文件的情况下合并排序文件?

时间:2011-07-06 15:02:21

标签: unix sorting command-line temporary-files

我正在尝试将UNIX / Linux脚本中的许多已排序文件与sort -m合并,我注意到sort首先将结果写入临时文件,然后将其复制到目标。我对-m的理解是它假设文件是​​排序的,所以使用临时文件是完全没必要的,它浪费了硬盘空间和CPU周期(我在管道中使用sort等待排序输出任何东西。)有没有办法告诉sort在合并排序文件时不使用临时文件?还是更好的版本?

确切的CL看起来像:

$ sort -m -s -t '_' -k 1,1n -k 2,2n <(gunzip <file_1) [...] <(gunzip <file_n) | gzip >output

我正在使用GNU coreutils 5.97中的sort

2 个答案:

答案 0 :(得分:5)

man sort查看这些选项,它们可以让您最小化合并所需的空间量。

--batch-size=NMERGE  

一次最多合并NMERGE输入;更多使用临时文件

--compress-program=PROG 
用PROG压缩临时数据;用PROG -d

解压缩它们

答案 1 :(得分:1)

使用GNU coreutils 6.10运行,我没有看到这个问题。

您正在使用的命令行的一件事是&lt;(...)重定向在启动命令之前将输入写入临时文件。那可能是你看到的延迟吗?

我跑了这个命令:

sort -m a b c d e f g h i j | more

并没有为输出创建临时文件。我将输出管道输入更多,因此它会阻塞,然后查看/ proc以查看正在进行的操作。它打开了所有输入文件,并将管道发送到more命令,但就是这样。没有临时文件:

$ ls -l /proc/1308/fd
total 0
lrwx------ 1 brianb brianb 64 2014-06-24 18:50 0 -> /dev/pts/0
l-wx------ 1 brianb brianb 64 2014-06-24 18:50 1 -> pipe:[217016034]
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 10 -> /home/brianb/h
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 11 -> /home/brianb/i
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 12 -> /home/brianb/j
lrwx------ 1 brianb brianb 64 2014-06-24 18:50 2 -> /dev/pts/0
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 3 -> /home/brianb/a
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 4 -> /home/brianb/b
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 5 -> /home/brianb/c
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 6 -> /home/brianb/d
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 7 -> /home/brianb/e
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 8 -> /home/brianb/f
lr-x------ 1 brianb brianb 64 2014-06-24 18:50 9 -> /home/brianb/g