请允许我澄清一下:
假设我有一些关键字及其使用频率:
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