说我有一个文件:
ab
aa
c
aaaa
Run Code Online (Sandbox Code Playgroud)
我希望它像这样排序
c
aa
ab
aaaa
Run Code Online (Sandbox Code Playgroud)
即按行长排序,然后按字母顺序排序。这在bash中可能吗?
您可以将行的长度添加到每一行,然后进行数字排序,最后切出数字
< 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
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
在外壳排序最好的执行工具东西?)。
归档时间: |
|
查看次数: |
200 次 |
最近记录: |