Kus*_*nda 22
就地对文件进行排序:
sort -o file file
Run Code Online (Sandbox Code Playgroud)
使用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"
Run Code Online (Sandbox Code Playgroud)
还可能存在sort
直接调用二进制可执行文件的情况,而没有 shell 来对任何文件进行任何重定向。
请注意,这-o
是一个标准选项,而--output
是一个 GNU 扩展。
Gil*_*il' 13
主要目的是能够就地对文件进行排序。您不能通过重定向来做到这一点,因为会在启动之前sort myfile >myfile
截断。myfile
sort
其特别有用的原因sort
是,sort
传统上的实现能够处理大文件(可能比 RAM 大得多),并且使用磁盘上的临时文件来执行此操作。相反,其他传统的文本处理实用程序主要设计为将文件作为流逐行处理,并且它们支持大文件,因为它们一次不需要在内存中保留多于几行。
这种能力早在Unix 第二版中就被引入了。此版本记录了它将输入复制到临时文件。原因是它可以对 RAM 不足的大文件进行排序。Unixsort
实用程序几乎从一开始就考虑到了大文件。
第二版手册没有明确说明输入文件可以与输出文件相同,我也找不到源代码来确认,但这可以从实现技术中得出。(在第一版中,手册没有提到什么特别的;我也找不到源代码,但在这种情况下二进制文件不会产生正确的输出。)顺便说一句,在这些早期版本中,语法是sort input output
,还没有sort -o output input
因为命令行选项的语法尚未确定。
在第三版 Unix 中,明确提到了就地排序的能力:用排序版本sort myfile
替换。在第四版Unix中,语法略有变化:将排序后的输出写入标准输出,但对文件进行就地排序(手册明确指出\xe2\x80\x9c的输入和输出文件可能是相同的\xe2\x80\ x9d)。在第五版 Unix 中,指定输出文件的语法是现代的myfile
sort myfile
sort myfile myfile
-o
选项。
第五版是第一个支持合并模式(sort -m
)的,也是第一个支持多个输入文件的。这是相关的:合并模式仅对多个输入有用,而将多个文件排序在一起是一种罕见的需求,并且可以在cat \xe2\x80\xa6 | sort
几乎没有性能损失的情况下完成(因为sort
无论如何都会将数据写入临时文件)。在合并模式下,sort
无法写入其中一个输入文件,因为在这种模式下,它一次一行读取所有输入并逐步写入输出,它不会复制。
写入输入文件的能力(合并模式除外)在 Unix 和(大多数)克隆的历史中一直保留,并且是POSIX所要求的。
\n