shell - 使用自定义排序顺序对 Unix 中的字母数字字符串进行排序

标签 shell sorting unix

我有一份姓名列表,但顺序不正确。如何使用字母部分的自定义排序顺序,以正确的字母数字顺序排列它们?

我的文件numbers.txt:

alpha-1
beta-3
alpha-10
beta-5
alpha-5
beta-1
gamma-7
gamma-1
delta-10
delta-2

要点是我的脚本应该认识到它应该在 beta 之前打印 alpha,在 gamma 之前打印 beta code> 和 delta 之前的 gamma

也就是说,单词应该根据它们所代表的希腊字母表中的字母顺序进行排序。

预期订单:

alpha-1
alpha-5
alpha-10
beta-1
beta-3
beta-5
gamma-1
gamma-7
delta-2
delta-10

PS:我尝试使用sort -nnumbers.txt,但它不符合我的需要。

最佳答案

您可以使用辅助 awk 命令,如下所示:

awk -F- -v keysInOrder="alpha,beta,gamma,delta" '
    BEGIN {
        split(keysInOrder, a, ",")
        for (i = 1; i <= length(a); ++i) keysToOrdinal[a[i]] = i
    }
    { print keysToOrdinal[$1] "-" $0 }
' numbers.txt | sort -t- -k1,1n -k3,3n | cut -d- -f2-
  • awk 命令用于:

    • 将自定义键映射到反射(reflect)所需排序顺序的数字上;请注意,完整的键列表必须按顺序通过变量 keysInOrder 传递。

    • 将数字作为辅助列添加到输入之前,也使用分隔符 - ;例如,beta-3 变为 2-beta-3,因为 beta 位于有序列表中的位置 2排序键。

  • sort 然后根据映射数字以及第二列中的原始数字对 awk 的输出进行排序,得到所需的自定义排序顺序。

  • cut 然后删除辅助。再次映射数字。

关于shell - 使用自定义排序顺序对 Unix 中的字母数字字符串进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41804397/

相关文章:

Git commit -m 不接受消息中的空格

cocoa - 如何使构建 Xcode 目标依赖于 shell 脚本?

ios - 如何在新数组中捕获过滤后的值

仅当没有文件时才删除目录的bash shell脚本

linux - 使用 bash 对文件进行算术运算

bash - 使用 tee 重定向文件描述符 3

linux - "source in"如何使用shell脚本设置环境变量

java - 在android中排序对象列表

c++ - 如何在c/c++中将字符串中的字母按字母顺序排序?

php - Centos 7 - 错误 : Package: php-gd-5. 3.3-27.el6_5.2.x86_64(更新)