繁体   English   中英

如何就地对文件进行排序?

[英]How to sort a file in-place?

当我们使用sort file命令时,文件以排序的方式显示其内容。 如果我不想在标准输出上获得任何输出,而是在输入文件中获得任何输出怎么办?

您可以使用-o--output=FILE选项来指示相同的输入和输出文件:

sort -o file file

不重复文件名(使用bash 大括号扩展

sort -o file{,}

⚠️重要提示:一个常见的错误是尝试将输出重定向到相同的输入文件(例如sort file > file )。 这不起作用,因为 shell 正在进行重定向(不是sort(1)程序),输入文件(也作为输出)将在给sort(1)程序读取它的机会之前被删除。

sort命令默认将排序操作的结果打印到标准输出。 为了实现“就地”排序,您可以这样做:

sort -o file file

这会用排序的输出覆盖输入file 用于指定输出的-o开关由 POSIX 定义,因此应该在所有版本的sort上都可用:

-o 指定要使用的输出文件的名称,而不是标准输出。 该文件可以与输入文件之一相同。

如果您不幸拥有一个没有-o开关的sort版本( Luis向我保证它们存在),您可以以标准方式实现“就地”编辑:

sort file > tmp && mv tmp file
sort file | sponge file

这是在以下 Fedora 包中:

moreutils : Additional unix utilities
Repo        : fedora
Matched from:
Filename    : /usr/bin/sponge

这是(ab)使用vim的一种方法:

vim -c :sort -c :wq -E -s "${filename}"

-c :sort -c :wq部分在文件打开后调用 vim 命令。 -E-s是必要的,以便 vim 以不绘制到终端的“无头”模式执行。

sort -o "${filename}" "${filename}"方法相比,这几乎没有任何好处,只是它只接受文件名参数一次。


这对我在.gitignore文件的nanorc条目中实现formatter指令很有用。 这是我用来做的:

syntax "gitignore" "\.gitignore$"

formatter vim -c :sort -c :wq -E -s

您想对文件夹和子文件夹中的所有文件进行排序以覆盖它们吗?

用这个:

find . -type f -exec sort {} -o {} \;

要对文件进行就地排序,请尝试:

echo "$(sort your_file)" > your_file

如其他答案中所述,您不能直接将输出重定向回输入文件。 但是您可以先评估sort命令,然后将其重定向回原始文件。 通过这种方式,您可以实现就地排序。

同样,您也可以将此技巧应用于其他命令,例如paste以实现逐行追加。

没有关于几个文件的答案,所以:

sort -u file1 file2 -o file1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM