gpt4 book ai didi

awk - 使用 AWK 对关联数组进行排序

转载 作者:行者123 更新时间:2023-12-02 18:13:02 24 4
gpt4 key购买 nike

这是我的数组(gawk 脚本):

myArray["peter"] = 32
myArray["bob"] = 5
myArray["john"] = 463
myArray["jack"] = 11

排序后,我需要以下结果:

bob    5
jack 11
peter 32
john 463

当我使用“asort”时,索引会丢失。如何在不丢失索引的情况下按数组值排序? (我需要根据其值排序索引)

(我需要仅使用 awk/gawk 获得此结果,而不是 shell 脚本、perl 等)

如果我的帖子不够清楚,这里有另一篇帖子解释了同样的问题:http://www.experts-exchange.com/Programming/Languages/Scripting/Shell/Q_26626841.html )

提前致谢

更新:

谢谢你们俩,但我需要按值排序,而不是索引(我想要根据其值排序索引)。

换句话说,我需要这个结果:

bob    5
jack 11
peter 32
john 463

不是:

bob 5
jack 11
john 463
peter 32

(我同意,我的例子很困惑,选择的值非常糟糕)

根据 Catcall 的代码,我编写了一个可以工作的快速实现,但它相当丑陋(我在排序之前连接键和值,并在比较期间拆分)。它看起来像这样:

function qsort(A, left, right,   i, last) {
if (left >= right)
return
swap(A, left, left+int((right-left+1)*rand()))
last = left
for (i = left+1; i <= right; i++)
if (getPart(A[i], "value") < getPart(A[left], "value"))
swap(A, ++last, i)
swap(A, left, last)
qsort(A, left, last-1)
qsort(A, last+1, right)
}

function swap(A, i, j, t) {
t = A[i]; A[i] = A[j]; A[j] = t
}

function getPart(str, part) {
if (part == "key")
return substr(str, 1, index(str, "#")-1)
if (part == "value")
return substr(str, index(str, "#")+1, length(str))+0
return
}

BEGIN { }
{ }
END {

myArray["peter"] = 32
myArray["bob"] = 5
myArray["john"] = 463
myArray["jack"] = 11

for (key in myArray)
sortvalues[j++] = key "#" myArray[key]

qsort(sortvalues, 0, length(myArray));

for (i = 1; i <= length(myArray); i++)
print getPart(sortvalues[i], "key"), getPart(sortvalues[i], "value")
}

当然,如果你有更干净的东西,我很感兴趣......

感谢您的宝贵时间

最佳答案

编辑:

按值排序

哦!要对进行排序,有点麻烦,但您可以使用原始数组的值和索引的串联作为新数组中的索引来创建一个临时数组。然后,您可以 asorti() 临时数组并将连接的值拆分回索引和值。如果您无法理解那些令人费解的描述,那么代码会更容易理解。它也很短。

# right justify the integers into space-padded strings and cat the index
# to create the new index
for (i in myArray) tmpidx[sprintf("%12s", myArray[i]),i] = i
num = asorti(tmpidx)
j = 0
for (i=1; i<=num; i++) {
split(tmpidx[i], tmp, SUBSEP)
indices[++j] = tmp[2] # tmp[2] is the name
}
for (i=1; i<=num; i++) print indices[i], myArray[indices[i]]

编辑2:

如果您有 GAWK 4,您可以按值的顺序遍历数组,而无需执行显式排序:

#!/usr/bin/awk -f
BEGIN {
myArray["peter"] = 32
myArray["bob"] = 5
myArray["john"] = 463
myArray["jack"] = 11

PROCINFO["sorted_in"] = "@val_num_asc"

for (i in myArray) {
{print i, myArray[i]}}
}

}

有按索引或值遍历、升序或降序等选项的设置。您还可以指定自定义函数。

上一个答案:

按索引排序

如果您有 AWK,例如支持 asorti()gawk 3.1.2 或更高版本:

#!/usr/bin/awk -f
BEGIN {
myArray["peter"] = 32
myArray["bob"] = 5
myArray["john"] = 463
myArray["jack"] = 11

num = asorti(myArray, indices)
for (i=1; i<=num; i++) print indices[i], myArray[indices[i]]
}

如果您没有asorti():

#!/usr/bin/awk -f
BEGIN {
myArray["peter"] = 32
myArray["bob"] = 5
myArray["john"] = 463
myArray["jack"] = 11

for (i in myArray) indices[++j] = i
num = asort(indices)
for (i=1; i<=num; i++) print i, indices[i], myArray[indices[i]]
}

关于awk - 使用 AWK 对关联数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5342782/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com