对文件的一部分进行排序

对文件的一部分进行排序

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

Nome     Note
------------
Mehdi    0
Sunday   20
Others   10
Shnou    5

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

答案1

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

方法#1:使用头尾

$ (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

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

方法#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

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

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

方法#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

答案2

要就地覆盖文件,您可以执行以下操作:

{
  head -n 2 &&
    sort -k2n
} < the-file.txt 1<> the-file.txt

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

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

 a 10
b  2

(前面有一个空格a,后面有两个空格b),-t' ' -nk2(记住-k2是为了从字段 2 到行尾,同时-k2,2仅字段 2) 将"a 10"" 2"数字进行比较,而-nk2单独将" 10""  2"数字进行比较(数字比较会忽略前导空格)。

答案3

我需要对一个文件的两个部分进行排序。受到其他答案的显着启发,这里是一个扩展答案:

文件.txt

Nome     Note
------------
Mehdi    0
Sunday   20
Others   10
Shnou    5

Example
------------
Foo
bar
Baz

Results: Finished!

多个部分可以通过不同的选项进行链接和排序或不链接和排序。作为最后一步,cat在最后输出任何未排序的块。

(head -n 2; head -n 4 | sort -nk2 ; head -n 3; head -n 3 | sort; cat ) < file.txt 1<> sorted.txt

排序.txt

Nome     Note
------------
Mehdi    0
Shnou    5
Others   10
Sunday   20

Example
------------
bar
Baz
Foo

Results: Finished!

相关内容