我有一个名称列表,这些名称不正确。如何使用字母部分的自定义排序顺序以正确的字母数字顺序获取它们?
我的档案numbers.txt
:
alpha-1
beta-3
alpha-10
beta-5
alpha-5
beta-1
gamma-7
gamma-1
delta-10
delta-2
要点是我的脚本应该认识到它应该alpha
在之前beta
,beta
之前gamma
和gamma
之前打印delta
。
也就是说,单词应根据它们所代表的希腊字母中字母的顺序进行排序。
预期订单:
alpha-1
alpha-5
alpha-10
beta-1
beta-3
beta-5
gamma-1
gamma-7
delta-2
delta-10
PS:我尝试过使用sort -n numbers.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
命令用于:
将自定义键映射到反映所需排序顺序的数字上;请注意,键的完整列表必须按keysInOrder
顺序通过variable传递。
也将数字作为辅助列添加到输入的前面,也要使用分隔符-
;例如,beta-3
成为2-beta-3
,因为beta
它在排序键的有序列表中的位置2中。
sort
然后awk
根据映射的数字以及第二列中的原始数字对输出进行排序,从而得出所需的自定义排序顺序。
cut
然后删除辅助。再次映射数字。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句