如何按终端的第二列对文件进行排序。该文件的内容是:
Nome Note
------------
Mehdi 0
Sunday 20
Others 10
Shnou 5
Run Code Online (Sandbox Code Playgroud)
使用sort -t' ' -nk2
并没有给我正确的结果。另外我如何确保文件的内容保持排序?
我认为你所追求的是这样的:
$ (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)
这需要文本文件的第一行,然后将前两行之后的所有内容拖尾,然后进行排序。
$ (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)
将文本文件作为输入,只显示第一行,对其余部分进行排序。
就地编辑文件通常不是一个好主意。这是可能的,但最好使用中间文件。
从@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)
要覆盖文件到位,您可以执行以下操作:
{
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"
数字上进行比较(并且数字比较忽略前导空格)。