awk数组排序 PROCINFO["sorted_in"]

时间:2022-10-28 08:05:23

默认AWK打印关联数组时,多半不会排序。

感觉上,关联数组的key是3位以上就不会排序了。

awk 'BEGIN{a["A"]="4";a["B"]="3";a["C"]="2";a["D"]="1";for(i in a)print i,a[i]}'

A 4
B 3
C 2
D 1

 

awk 'BEGIN{a["AA"]="4";a["BB"]="3";a["CC"]="2";a["DD"]="1";for(i in a)print i,a[i]}'

AA 4
BB 3
CC 2
DD 1


awk 'BEGIN{a["AAA"]="4";a["BBB"]="3";a["CCC"]="2";a["DDD"]="1";for(i in a)print i,a[i]}'

AAA 4
CCC 2
BBB 3
DDD 1
awk 'BEGIN{a["AAAA"]="4";a["BBBB"]="3";a["CCCC"]="2";a["DDDD"]="1";for(i in a)print i,a[i]}'

CCCC 2
BBBB 3
AAAA 4
DDDD 1

这时候加上 PROCINFO["sorted_in"] = "@ind_str_asc"

awk 'BEGIN{a["AAAA"]="4";a["BBBB"]="3";a["CCCC"]="2";a["DDDD"]="1";PROCINFO["sorted_in"]="@ind_str_asc";for(i in a)print i,a[i]}'

AAAA 4
BBBB 3
CCCC 2
DDDD 1

可以实现排序。这个功能对版本有限制,我在4.2.1实现,上网搜了一下,4好像就可以了。


排序可以有多种方式,具体​​GNU​​网站(英文)的8.1.6节有列表。

大致以下列表

以@a_b_c的式样

a:基于索引(ind)还是值(val)来排序

b:按字符串(str)比较,按数值(num)比较和按类型(type)比较。如果是按照类型,在升序的情况下,数值>字符串>数组

c:指定升序(asc)或降序(desc)

@unsorted:默认值 无序。

@ind_str_asc:基于索引按字符串比较方式升序排序。

@ind_str_desc:基于索引按字符串比较方式降序排序。

@ind_num_asc:基于索引按数值比较方式升序排序。无法转换成数值的视作数值0。

@ind_num_desc:基于索引按数值比较方式降序排序。无法转换成数值的视作数值0。

@val_type_asc:基于元素按照数据类型比较方式升序排序。

@val_type_desc:基于元素按照数据类型比较方式降序排序。

@val_str_asc:基于元素按照字符串比较方式升序排序。

@val_str_desc:基于元素按照字符串比较方式降序排序。

@val_num_asc:基于元素按照数值比较方式升序排序。

@val_num_desc:基于元素按照数值比较方式降序排序。