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

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

请允许我澄清一下:

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

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 兼容。

答案1

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

sort -k1,1nr -k2,2 inputfile

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

引用自POSIX 排序:

-k 键定义

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

字段开始[类型][,字段结束[类型]]

在哪里字段开始字段结束定义一个仅限于行的一部分的关键字段(请参阅扩展描述部分),类型是字符列表 'b'、'd'、'f'、'i'、'n'、' 中的修饰符河。 'b' 修饰符的行为应与-b选项类似,但仅适用于字段开始或者字段结束它所附着的。其他修饰符的行为应与相应的选项类似,但仅适用于它们所附加的关键字段;如果指定的话,它们应具有这种效果字段开始,字段结束, 或两者。如果任何修饰符附加到字段开始或到一个字段结束,任何选项均不适用。实现应支持该选项至少出现九次-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

相关内容