范围排序 Linux

4
大家好。我有一些关于bash中排序的问题。我正在使用Ubuntu 14.04。 第一个问题是:为什么如果我有一个名为some.txt的文件,其中包含以下内容:
b 8
b 9
a 8
a 9 

当我输入这个:

sort -n -k 2 some.txt 

结果将是:

a 8
b 8
a 9
b 9

这意味着文件首先按第二个字段排序,然后再按第一个字段排序,但我认为它将保持稳定,即...
b 8
a 8
...
...

也许如果两行相等,会应用字典序排序,是这样吗?
第二个问题是:为什么以下代码不起作用:
sort -n -k 1,2 try.txt 

文件try.txt的内容如下:
8 2
8 11
8 0
8 5
9 2
9 0

第三个问题实际上并不是有关排序的,但在我尝试这样做时它出现了。
sort blank.txt > blank.txt 

此后,blank.txt 文件为空。为什么会这样?

我已经修复了你的格式。请使用“编辑”链接查看我的修改。此外,请阅读[FAQ]和[Ask]以获取撰写好问题的提示。 - Jim Garrison
1个回答

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

我认为你想知道为什么第二列没有按数字排序。让我们回到sed手册:
‘-n’ ‘--numeric-sort’ ‘--sort=numeric’
数字排序。每行以数字开头,由...组成。
看起来使用-n只会对第一列进行数字排序。经过一些尝试,我找到了将每列数字排序的组合:
$ sort -k1,1n -k2,2n try.txt 
8 2
8 11
9 0
9 2
11 2
11 11

3
建议的链接#3:http://mywiki.wooledge.org/BashPitfalls#cat_file_.7C_sed_s.2Ffoo.2Fbar.2F_.3E_file - kojiro
1
可能算法不稳定是有充分的理由的:我猜测这会带来性能损失(不是时间复杂度,而是算法变得更加复杂,需要更多的指令)。 - Willem Van Onsem
非常感谢您,格伦·杰克曼。我以为这是基础知识,但显然不是。第一次尝试了不同的方法,但它们都没有起作用。您的方法很好,但我仍然不明白为什么这不起作用。sort -k 1n,2n try.txt语法很奇怪。如果有人能告诉我它是如何工作的,我会很高兴的。 - DPM
实际上,我忘了提到这个也可以工作: sort -k 1n -k 2n try.txt 但它也不方便。 - DPM
@WillemVanOnsem 一个排序算法“不稳定”可能有多个原因。第一个是优化,我认为你在暗示这一点。如果排序不需要保留输入数据原始顺序的任何方面,则排序可能更快。在这种情况下,不稳定可能会导致键等价类内的无法预测或随机排序。第二个原因,似乎是gnu sort的情况,是为了确保一致的结果;“最后一道防线”阶段会做额外的工作来对那些本来应该被稳定保留顺序的键等价类进行排序。 - Rhubbarb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接