我正在尝试将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
。
答案 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