如何按行长对文件进行排序,然后按字母顺序排序第二个键?

Anu*_*ush 1 sorting bash

说我有一个文件:

ab
aa
c
aaaa
Run Code Online (Sandbox Code Playgroud)

我希望它像这样排序

c
aa
ab
aaaa
Run Code Online (Sandbox Code Playgroud)

即按行长排序,然后按字母顺序排序。这在bash中可能吗?

Enr*_*lis 8

您可以将行的长度添加到每一行,然后进行数字排序,最后切出数字

< your_file awk '{ print length($0), $0; }' | sort -n | cut -f2
Run Code Online (Sandbox Code Playgroud)

你看我已经通过 完成了排序sort -n,没有做任何多键排序。老实说,我很幸运这有效:

  • 我不认为行可以以数字开头,所以我希望sort -n可以工作,因为如果所有字符串的长度相同,字母和数字排序会给出相同的结果,就像 exaclty 一样,因为我们按行长度排序,我正在通过awk添加。

  • 事实证明,即使您的输入有以数字开头的行,一切正常,原因是 sort -n

    1. 排序数值领先的数字部分的线;
    2. 关系的情况下,它用于strcmp比较整条线

    这是一些演示:

    $ echo -e '3 11\n3 2' | sort -n
    3 11
    3 2
    # the `3 ` on both lines makes them equal for numerical sorting
    # but `3 11` comes before `3 2` by `strcmp` before `1` comes before `2`
    
    $ echo -e '3 11\n03 2' | sort -n
    03 2
    3 11
    # the `03 ` vs `3 ` is a numerical tie,
    # but `03 2` comes before `3 11` by `strcmp` because `0` comes before `3`
    
    Run Code Online (Sandbox Code Playgroud)

    所以幸运的是,,包含在awk命令中的I插入了一个空格(实际上是一个OFS),即一个非数字,从而“破坏”了数字排序并让strcmp排序开始(在数字比较相等的整行上,在这个案例)。

    这种行为是否是 POSIX,我不知道,但我使用GNU coreutils 8.32的是sort. 有关详细信息,请参阅我的这个问题Unix 上的这个答案

awk可以做所有的本身,但我认为使用sort到排序是更地道(如,使用sort到排序)和有效,因为在注释解释(毕竟,为什么你会想到,sort在外壳排序最好的执行工具东西?)。