如何按行长对文件进行排序,然后按字母顺序排序第二个键?
说我有一个文件:
ab
aa
c
aaaa
我希望它像这样排序
c
aa
ab
aaaa
即按行长排序,然后按字母顺序排序。这在bash中可能吗?
回答
您可以将行的长度添加到每一行,然后进行数字排序,最后切出数字
< your_file awk '{ print length($0), $0; }' | sort -n | cut -f2
你看我已经通过 完成了排序sort -n,没有做任何多键排序。老实说,我很幸运这有效:
-
我不认为行可以以数字开头,所以我希望
sort -n可以工作,因为如果所有字符串的长度相同,字母和数字排序会给出相同的结果,就像 exaclty 一样,因为我们按行长度排序,我正在通过awk添加。 -
事实证明,即使您的输入有以数字开头的行,一切正常,原因是
sort -n- 排序数值上领先的数字部分的线;
- 在关系的情况下,它用于
strcmp比较整条线
这是一些演示:
$ echo -e '3 11n3 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 11n03 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`所以幸运的是,
,包含在awk命令中的I插入了一个空格(实际上是一个OFS),即一个非数字,从而“破坏”了数字排序并让strcmp排序开始(在数字比较相等的整行上,在这个案例)。这种行为是否是 POSIX,我不知道,但我使用
GNU coreutils 8.32的是sort. 有关详细信息,请参阅我的这个问题和Unix 上的这个答案。
awk可以做所有的本身,但我认为使用sort到排序是更地道(如,使用sort到排序)和有效,因为在注释解释(毕竟,为什么你会想到,sort在外壳排序最好的执行工具东西?)。