我想要排序一堆文件。我能做到
sort file.txt > foo.txt
mv foo.txt file.txt
但是我需要第二个文件吗?
(我当然试过了sort file.txt > file.txt
,但后来我的文件空了。)
答案 0 :(得分:12)
尝试:
sort -o file.txt file.txt
请参阅http://ss64.com/bash/sort.html
`-o OUTPUT-FILE'
Write output to OUTPUT-FILE instead of standard output. If
OUTPUT-FILE is one of the input files, `sort' copies it to a
temporary file before sorting and writing the output to
OUTPUT-FILE.
答案 1 :(得分:1)
像sort
这样的经典Unix工具的哲学包括你可以用它们构建一个管道。每个小工具都从STDIN
读取并写入STDOUT
。通过这种方式,管道中的下一个小工具可以将第一个输出作为输入读取并对其进行操作。
所以我要说这是一个错误,而不是一个功能。
请在ESR非常好的书中阅读P ipes, Redirection, and Filters。
答案 2 :(得分:1)
因为您正在写回同一个文件,所以在排序完成加载原始文件之前,您最终会遇到重定向打开输出文件的问题。所以是的,你需要使用一个单独的文件。
现在,已经说过,有一些方法可以先将整个文件缓冲到管道流中,但通常你不想这样做,尽管你可以写一些东西来做。但是你要在开始和结束时插入特殊工具来进行缓冲。但是,如果你使用>
重定向,Bash会很快打开输出文件。
答案 3 :(得分:0)
是的,你确实需要第二个文件!命令
sort file.txt > file.txt
会在开始执行stout
之前设置重定向sort
。这是破坏输入文件的某种方式。
如果要对许多文件进行排序,请尝试:
cat *.txt | sort > result.txt
答案 4 :(得分:0)
如果您正在处理从单个文件中排序固定长度记录,则排序算法可以交换文件中的记录。有一些可用的算法可供使用。您的选择取决于文件随机性属性的数量。通常,快速排序往往会交换最少数量的记录,并且与其他排序算法相比,通常是首先完成的排序。