排序范围Linux

DPM*_*DPM 4 linux sorting bash ubuntu range

大家.我有一些关于bash排序的问题.我正在使用Ubuntu 14.04.第一个问题是:为什么我有这个内容的some.txt文件:

b 8
b 9
a 8
a 9 
Run Code Online (Sandbox Code Playgroud)

当我输入这个:

sort -n -k 2 some.txt 
Run Code Online (Sandbox Code Playgroud)

结果将是:

a 8
b 8
a 9
b 9
Run Code Online (Sandbox Code Playgroud)

这意味着文件首先排序到第二个字段,然后到第一个字段,但我认为这将保持稳定,即

b 8
a 8
...
...
Run Code Online (Sandbox Code Playgroud)

也许如果两行相等则应用词典排序或什么?

第二个问题是:为什么以下不起作用:

sort -n -k 1,2 try.txt 
Run Code Online (Sandbox Code Playgroud)

try.txt文件是这样的:

8 2
8 11
8 0
8 5
9 2
9 0
Run Code Online (Sandbox Code Playgroud)

第三个问题不是用于排序,而是在我尝试这样做时出现:

sort blank.txt > blank.txt 
Run Code Online (Sandbox Code Playgroud)

在此之后,blank.txt文件为空.这是为什么 ?

gle*_*man 5

  1. 显然,默认情况下GNU排序不稳定:添加-s选项

    最后,作为最后的手段,当所有键比较相等时,sort会比较整行,就像没有指定除--reverse(-r)之外的任何排序选项一样.--stable(-s)选项禁用此最后的比较,以便所有字段比较相等的行保留其原始相对顺序.(https://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html)

  2. 如果您不显示文本文件,则无法回答您的问题

  3. 将控制权交给程序之前,shell会处理重定向.该>如果存在重定向将截断文件.之后,您将提供一个空文件sort

对于#2,你实际上没有解释什么不起作用.扩展您的示例数据,就会发生这种情况

$ cat try.txt
8 2
8 11
9 2
9 0
11 11
11 2
$ cat try.txt
8 2
8 11
9 2
9 0
11 11
11 2
Run Code Online (Sandbox Code Playgroud)

我假设你想知道为什么第二列没有按数字排序.让我们回到sed手册:

'-n'
' -
数字排序' ' - sort = numeric'

按数字排序.这个数字从每一行开始,包括......

看起来像-n只使用数字排序第一列.经过一些反复试验后,我发现这个组合以数字方式对每个列进行排序:

$ sort -k1,1n -k2,2n try.txt 
8 2
8 11
9 0
9 2
11 2
11 11
Run Code Online (Sandbox Code Playgroud)

  • [#3的建议链接](http://mywiki.wooledge.org/BashPitfalls#cat_file_.7C_sed_s.2Ffoo.2Fbar.2F_.3E_file) (3认同)