以第一列的降序对数据进行排序,对于相等的值,以升序使用第二列


22

请允许我澄清一下:

假设我有一些关键字,它们的使用频率如下:

12 Hi
7  Hash
7  C++  
9  Superuser
17 Stackoverflow
9  LaTeX  
42 Life
9  Ubuntu

我想要的是根据频率以降序对数据进行排序,如果有一些相等的值,则应该以升序使用第二列。

sort -n -r foo.txt

第一部分而不是第二栏是否也是reversed

42 Life
17 Stackoverflow
12 Hi
9  Ubuntu
9  Superuser
9  LaTeX  
7  Hash
7  C++

如何获得以下结果?

42 Life
17 Stackoverflow
12 Hi
9  LaTeX  
9  Superuser
9  Ubuntu
7  C++ 
7  Hash

我认为我必须使用-k参数,但是我不知道怎么做!

我想知道如何仅使用的sort命令即可完成此操作bash。但是,如果不可能仅通过来实现sort,则其他命令应与Bourne Shell兼容。


[有点OT]:尽管与此特定数据等效,但是使用GNU-sort -g(通用数字)选项而不是-n用于数值比较是更安全的:它对浮点数和整数均适用。
arielf

Answers:


32

使用条件分别指定排序键:

sort -k1,1nr -k2,2 inputfile

这指定第一个键按相反的顺序按数字顺序排序,而第二个键按默认排序顺序排序。

引用POSIX排序

-k keydef

keydef参数是一个受限制的排序键字段定义。该定义的格式为:

field_start [ type ] [ ,field_end [ type ]]

其中field_startfield_end定义了限制在行的一部分的键字段(请参阅“扩展描述”部分),而type是字符“ b”,“ d”,“ f”,“ i”,“ n','r'。'b'修饰符的行为类似于该-b选项,但仅适用于它所附加的field_startfield_end。其他修饰符的行为类似于相应的选项,但仅适用于它们所附加的键字段;如果使用field_startfield_end或同时指定了两者,则它们将具有此效果。,任何选项均不适用。实现应至少支持该-k选项的九次出现,这在命令行顺序上应是重要的。如果未-k指定选项,则应使用整行的默认排序键。

当有多个密钥字段时,仅在所有较早的密钥比较相等之后才应比较较后的密钥。除了在-u指定的选项,否则比较相等线,责令仿佛没有的选项-d-f-i-n,或-k存在(但-r 仍然有效,如果指定了),并在该显著行的所有字节比较。未指定仍比较相等的行的写入顺序不确定。

这将产生:

42 Life
17 Stackoverflow
12 Hi
9  LaTeX
9  Superuser
9  Ubuntu
7  C++
7  Hash

谢谢。做到了。必须等待10分钟才能接受!
2014年

@StephaneChazelas感谢您指出来;更新了参考。
devnull 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.