如何就地排序文件?

问题描述 投票:0回答:7

当我们使用

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

linux bash shell unix
7个回答
628
投票

可以使用sort的

-o
--output=FILE
选项来表示相同的输入输出文件:

sort -o file file

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

sort -o file{,}

⚠️ 重要提示: 一个常见的错误是试图将输出重定向到同一个输入文件 (例如

sort file > file
)。这不起作用,因为 shell 正在进行重定向(不是 sort(1) 程序)并且输入文件(作为输出)将在给 sort(1) 程序机会之前被擦除阅读它。


104
投票

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

sort -o file file

这会用排序后的输出覆盖输入

file
-o
开关,用于指定输出, 由 POSIX 定义,因此应该在所有版本的
sort
上可用:

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

如果您不幸拥有一个没有

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

sort file > tmp && mv tmp file
or
sort file > tmp && mv -f tmp file

19
投票
sort file | sponge file

这是在以下 Fedora 软件包中:

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

7
投票

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

使用这个:

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

6
投票

这是一种(ab)使用

vim
的方法:

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

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

这与

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


这对我在

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

syntax "gitignore" "\.gitignore$"

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

4
投票

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

echo "$(sort your_file)" > your_file

如其他答案中所述,您不能直接将输出重定向回输入文件。但是您可以先评估

sort
命令,然后将其重定向回原始文件。通过这种方式,您可以实现就地排序。

同样,您也可以将此技巧应用于其他命令,例如

paste
,以实现逐行追加。


2
投票

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

sort -u file1 file2 -o file1
© www.soinside.com 2019 - 2024. All rights reserved.