如何按终端的第二列对文件进行排序。该文件的内容是:
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!