awk PROCINFO["sorted_in"] 多维数组排序问题

Posted

技术标签:

【中文标题】awk PROCINFO["sorted_in"] 多维数组排序问题【英文标题】:awk PROCINFO["sorted_in"] Multidimensional array sorting problem 【发布时间】:2021-09-04 07:57:46 【问题描述】:
[root@rocky ~]# cat c
a b 1
a c 4
a r 6
a t 2
b a 89
b c 76
a d 45
b z 9
[root@rocky ~]# awk 'a[$1][$2]=$3ENDPROCINFO["sorted_in"]="@val_num_asc";for(i in a)for(x in a[i])print i,x,a[i][x]' c
a b 1
a t 2
a c 4
a r 6
a d 45
b z 9
b c 76
b a 89
[root@rocky ~]# awk 'a[$2]=$3ENDPROCINFO["sorted_in"]="@val_num_asc";for(i in a)print i,a[i]' c
b 1
t 2
r 6
z 9
d 45
c 76
a 89
[root@rocky ~]# awk 'a[$2]=$3ENDPROCINFO["sorted_in"]="@val_num_desc";for(i in a)print i,a[i]' c
a 89
c 76
d 45
z 9
r 6
t 2
b 1
[root@rocky ~]# awk 'a[$1][$2]=$3ENDPROCINFO["sorted_in"]="@val_num_desc";for(i in a)for(x in a[i])print i,x,a[i][x]' c
a d 45
a r 6
a c 4
a t 2
a b 1
b a 89
b c 76
b z 9
[root@rocky ~]# awk --version
GNU Awk 4.2.1, API: 2.0 (GNU MPFR 3.1.6-p2, GNU MP 6.1.2)

使用PROCINFO["sorted_in"]="@val_num_asc"PROCINFO["sorted_in"]="@val_num_desc"对多维数组排序有问题,没有真正的排序。一维数组没有问题。问题是什么?是不是因为不支持多维数组?

【问题讨论】:

不清楚您想通过 4 个 awk 脚本和问题中的相关输出告诉我们什么。请edit你的问题显示一个minimal reproducible example,只有1个输入和实际输出示例,添加你期望的输出而不是你得到的输出,并告诉我们问题出在哪里,而不是仅仅说There is a problem但不告诉我们是什么。 一旦您告诉我们您期望什么输出(以及为什么),我们可以帮助您编写代码来产生该输出。同时,您可能对how-do-you-copy-a-multi-dimensional-array-i-e-an-array-of-arrays-in-awk 感兴趣,因为它展示了如何使用isarray(),这可能与您正在尝试做的事情有关。 【参考方案1】:
awk 'a[$1][$2]=$3ENDPROCINFO["sorted_in"]="@val_num_asc";for(i in a)for(x in a[i])print i,x,a[i][x]' c

a b 1
a t 2
a c 4
a r 6
a d 45
b z 9
b c 76
b a 89

这不是错误,它应该是这样工作的。仔细看,这里使用的是嵌套循环。

for(i in a)

这是一个外部循环,它将在 2 次迭代中遍历值 ab

for(x in a[i])

这是一个内部循环,它将第一次遍历 for a,[$2] 和第二次 b,[$2] 的值。

@val_num_asc 将按照 $3 的值按升序对值进行排序。如果您仔细观察,$1=a 的打印值 1,2,4,6,45 将按照值进行数字排序,9,76,89$1=b 也是如此。


如果您想使用awk 对输出进行排序,请使用以下建议的解决方法

awk 'a[$1 OFS $2]=$3 END PROCINFO["sorted_in"]="@val_num_asc"; for(x in a) print x, a[x]' c

a b 1
a t 2
a c 4
a r 6
b z 9
a d 45
b c 76
b a 89

【讨论】:

我认为@val_num_asc will sort values numerically in ascending order as per the value which is $3 不适合最外层循环。 a["a"] 的值不是 $3 中的值,它是一个索引为 b、c、r、t、d 的数组,同样a["b"] 的值也是一个索引为 a、c、d 的数组.那么如何比较 2 个数组来决定哪一个在数字上应该排在第一位呢?我不认为你可以,所以我希望从外部循环产生的顺序是随机(散列)顺序,就像你没有指定排序顺序一样 - OP 得到 a 然后 b 只是巧合。 是的,埃德。我所说的@val_num_asc will sort values numerically in ascending order 的意思是它只对a["a"]a["b"] 的值分别进行排序。

以上是关于awk PROCINFO["sorted_in"] 多维数组排序问题的主要内容,如果未能解决你的问题,请参考以下文章

awk "sort -rnk3"

nginx日志截取

您使用的十大unixshell命令

每日一题20180327

awk sort uniq

30 windows_30_ProcInfo 进程信息