如何对文件进行原位排序


205

当我们使用sort file命令时,文件以一种排序的方式显示其内容,如果我不想得到任何种类的输出,而是一个经过排序的文件怎么办?


请更新您的问题,以明确告诉您要对文件排序的结果。您是否要对它进行排序,用file同一文件的排序内容替换未排序的内容?当前陈述问题的方式,什么也不做是正确的答案(您不希望有任何输出,因此什么也不做)。
基思·汤普森

@KeithThompson实际上感谢您的关注,我正在尝试对文件进行排序,但希望避免屏幕上的输出。
阿里·萨吉德

那么,您希望输出到哪里?放入新文件?变成原始文件?到大厅下的打印机?
基思·汤普森

1
进入原始档案
Ali Sajid

运行sort infile >outfile,您将获得排序后的输出到文件“ outfile”中。然后,您可以删除原始的“ infile”,一切正常。
2015年

Answers:


407

您可以使用文件重定向来重定向排序后的输出:

sort input-file > output_file

或者你也可以使用-o--output=FILE排序的选项,以指示相同的输入和输出文件:

sort -o file file

注意:一个常见的错误是试图将输出重定向到相同的输入文件(例如sort file > file)。这不起作用,因为外壳正在进行重定向(而不是sort(1)程序),并且输入文件(也作为输出)将在为sort(1)程序提供读取机会之前被擦除。


88
关于常见错误的注意事项
德雷克斯

1
当您需要手动编辑LaTeX +1的字典时,这确实派上了用场
Bryson S.

6
仅提及顺序的重要性。从GNU sort信息页面: -o OUTPUT-FILE' --output = OUTPUT-FILE'将输出而不是标准输出写入OUTPUT-FILE。在较新的系统上,在任何输入文件之前-o' cannot appear after an input file if 设置POSIXLY_CORRECT',例如sort F -o F'. Portable scripts should specify -o OUTPUT-FILE'。
Yassine ElBadaoui

14
为避免重复文件名:sort -o file{,}
tstenner '18

65

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

sort -o file file

这将file使用排序的输出覆盖输入。-o用于指定输出的开关是由POSIX定义的,因此应在以下所有版本上可用sort

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

如果您很不幸没有使用该版本sort-o开关(路易斯向我保证它们存在),则可以通过标准方式实现“就地”编辑:

sort file > tmp && mv tmp file

2
+ ^是最佳答案,也有模棱两可的问题,但仍处于首页排名,因此需要提高。
u2n19年

6
sort file | sponge file

在以下Fedora软件包中:

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

1
在使用sudo apt install moreutils
Serge Stroobandt

4

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

echo "$(sort your_file)" > your_file

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

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


1
这很不好,因为它不适用于大文件,以换行符结尾的条带,echo可能会与POSIX中的反斜杠转义符-o
混淆

4

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

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

-c :sort -c :wq文件打开后,该部分调用命令以vim。 -E并且-s是必需的,以便vim以不吸引终端的“无头”模式执行。

这与该sort -o "${filename}" "${filename}"方法几乎没有任何好处,除了它只使用一次filename参数。


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

syntax "gitignore" "\.gitignore$"

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

4
您在使用vim nanorc吗?噢,讽刺。
布雷特·霍尔曼

2

是否要对文件夹中的所有文件进行排序并覆盖它们的子文件夹?

用这个:

find . -type f -exec sort {} -o {} \;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.