对文件的一部分进行排序

7 text-processing sort

如何按终端的第二列对文件进行排序。该文件的内容是:

Nome     Note
------------
Mehdi    0
Sunday   20
Others   10
Shnou    5
Run Code Online (Sandbox Code Playgroud)

使用sort -t' ' -nk2并没有给我正确的结果。另外我如何确保文件的内容保持排序?

slm*_*slm 7

我认为你所追求的是这样的:

方法一:使用头尾

$ (head -n 2 sample.txt; tail -n +3 sample.txt | sort -t' ' -nk2) > a.tmp && mv a.tmp sample.txt

Nome     Note
------------
Mehdi    0
Shnou    5
Others   10
Sunday   20
Run Code Online (Sandbox Code Playgroud)

这需要文本文件的第一行,然后将前两行之后的所有内容拖尾,然后进行排序。

方法#2:只使用头部

$ (head -n 2; sort -t' ' -nk2) < sample.txt > a.tmp && mv a.tmp sample.txt

Nome     Note
------------
Mehdi    0
Shnou    5
Others   10
Sunday   20
Run Code Online (Sandbox Code Playgroud)

将文本文件作为输入,只显示第一行,对其余部分进行排序。

就地编辑文件通常不是一个好主意。这是可能的,但最好使用中间文件。

方法 #3:在没有中间文件的情况下执行 #2

从@StephaneChazelas 那里窃取这个想法,您可以使用“1<>”符号来打开文件以进行读写,以及他对sort命令提出的改进建议。

$ (head -n 2; sort -nk2) < sample.txt 1<> sample.txt

Nome     Note
------------
Mehdi    0
Shnou    5
Others   10
Sunday   20
Run Code Online (Sandbox Code Playgroud)


Sté*_*las 7

要覆盖文件到位,您可以执行以下操作:

{
  head -n 2 &&
    sort -k2n
} < the-file.txt 1<> the-file.txt
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为sort在开始写入其输出之前已完全读取其输入,因此可以写入它正在读取的文件。此外,它的输出与输入的大小相同,因此最终无需截断文件。

请注意,如果您使用-t' '而不是默认分隔符,则输入中的每个空格字符都会创建一个新字段,例如:

 a 10
b  2
Run Code Online (Sandbox Code Playgroud)

(前面有一个a空格,后面有 2 个空格b),-t' ' -nk2(记住-k2从字段 2 到行尾,而-k2,2字段 2)将"a 10"" 2"数字上进行比较,而-nk2单独将" 10""  2"数字上进行比较(并且数字比较忽略前导空格)。