我有一份姓名列表,但顺序不正确。如何使用字母部分的自定义排序顺序,以正确的字母数字顺序排列它们?
我的文件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/