假设我有一个文件:
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
- sorts 数字上 on the 前导数字部分线路;
- 的情况下ties, 它用
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`
所以幸运的是,
我包括在awk
命令插入一个空格(实际上是OFS
),即非数字,从而“破坏”数字排序并让strcmp
排序启动(在本例中,在数字比较相等的整行上)。
我不知道这种行为是否是 POSIX,但我正在使用GNU coreutils 8.32
's sort
。参考我的这个问题 https://stackoverflow.com/q/65302655/5825294 and 这个答案在 Unix 上 https://unix.stackexchange.com/a/382805/164309了解详情。
awk
可以自己做所有的事情,但我认为使用sort
排序更惯用(例如,use sort
to sort)并且高效,正如评论中所解释的(毕竟,你为什么不期望那样sort
是 shell 中性能最好的排序工具吗?).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)