为什么 sort 有一个 --output= 选项?

为什么 sort 有一个 --output= 选项?

sort -o似乎是多余的。当我们可以使用的时候,使用它还有什么意义呢sort >

有时无法使用 shell 重定向吗?

答案1

就地对文件进行排序:

sort -o file file

使用sort file >file首先将调用的文件截断file到零大小,然后sort使用该空文件进行调用,无论原始文件的内容是什么,都会产生一个空的输出文件。

此外,在命令或选项列表自动生成的通过例如脚本,添加-o somefile到选项末尾将覆盖任何先前设置的输出文件,这允许通过附加选项来控制输出文件位置。

sort_opt=( some list of options )

if [ ... something ... ]; then
    # We don't need to go through and delete any old use of "-o"
    # because this later option would override it.
    sort_opt+=( -o somefile.out )
fi

sort "${sort_opt[@]}" "$thefile"

还可能存在sort直接调用二进制可执行文件的情况,而没有 shell 来对任何文件进行任何重定向。

请注意,这-o是一个标准选项,而--output是一个 GNU 扩展。

答案2

主要目的是能够就地对文件进行排序。您不能通过重定向来做到这一点,因为会在启动之前sort myfile >myfile截断。myfilesort

其特别有用的原因sort是,sort传统上的实现能够处理大文件(可能比 RAM 大得多),并且使用磁盘上的临时文件来执行此操作。相反,其他传统的文本处理实用程序主要设计为将文件作为流逐行处理,并且它们支持大文件,因为它们一次不需要在内存中保留多于几行。

这个能力早在第二版Unix。此版本记录了它将输入复制到临时文件。原因是它可以对 RAM 不足的大文件进行排序。 Unixsort实用程序几乎从一开始就考虑到了大文件。

第二版手册没有明确说明输入文件可以与输出文件相同,我也找不到源代码来确认,但这可以从实现技术中得出。 (在第一版,手册没有提到什么特别的;我也找不到来源,但二进制在这种情况下不会产生正确的输出。)顺便说一句,在这些早期版本中,语法是sort input output,还不是sort -o output input,因为命令行选项的语法尚未牢固建立。

在第三版 Unix 中中,明确提到了就地排序的能力:用排序版本sort myfile替换。myfile在第四版 Unix 中,语法略有变化:sort myfile将排序的输出写入标准输出,但sort myfile myfile对文件进行就地排序(手册明确指出“输入和输出文件可能相同。”)。在第五版 Unix 中,指定输出文件的语法是现代-o选项。

第五版是第一个支持合并模式(sort -m)的,也是第一个支持多个输入文件的。这是相关的:合并模式仅对多个输入有用,而将多个文件排序在一起是一种罕见的需求,并且可以cat … | sort在几乎没有性能损失的情况下完成(因为sort无论如何都会将数据写入临时文件)。在合并模式下,sort无法写入其中一个输入文件,因为在这种模式下,它一次一行读取所有输入并逐步写入输出,它不会复制。

写入输入文件的能力(合并模式除外)在整个 Unix 和(大多数)克隆的历史中一直被保留,并且是POSIX

相关内容