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

Pou*_*uya 23 text-processing sort

请允许我澄清:

假设我有一些关键字及其使用频率:

12 Hi
7  Hash
7  C++  
9  Superuser
17 Stackoverflow
9  LaTeX  
42 Life
9  Ubuntu
Run Code Online (Sandbox Code Playgroud)

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

sort -n -r foo.txt
Run Code Online (Sandbox Code Playgroud)

第一部分但第二列是否也是reversed

42 Life
17 Stackoverflow
12 Hi
9  Ubuntu
9  Superuser
9  LaTeX  
7  Hash
7  C++
Run Code Online (Sandbox Code Playgroud)

我怎样才能达到以下结果?

42 Life
17 Stackoverflow
12 Hi
9  LaTeX  
9  Superuser
9  Ubuntu
7  C++ 
7  Hash
Run Code Online (Sandbox Code Playgroud)

我想我必须使用-k参数,但我不知道如何使用!

我想知道这是如何使用单独完成sort的命令bash。但是,如果仅通过 无法实现此目的sort,则其他命令应与 Bourne shell 兼容。

dev*_*ull 34

使用条件单独指定排序键:

sort -k1,1nr -k2,2 inputfile
Run Code Online (Sandbox Code Playgroud)

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

引用POSIX 排序

-k 密钥定义

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

field_start [类型][ ,field_end [类型]]

其中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
Run Code Online (Sandbox Code Playgroud)